<template>
	<div>
		<el-container>
			<el-main>
				<el-form :inline="true" :model="formInline" class="demo-form-inline">
					<el-form-item>
						<el-input clearable v-model="formInline.questionName" placeholder="请输入问题" @keydown.enter.native="algorithmPage"></el-input>
					</el-form-item>
					<el-select v-model="formInline.questionType" clearable placeholder="请选择" @change="algorithmPage">
						<el-option v-for="item in questionType" :key="item" :label="item" :value="item"></el-option>
					</el-select>
					<el-select v-model="formInline.tag" clearable multiple placeholder="请选择">
						<el-option v-for="item in allOptions" :key="item" :label="item" :value="item"></el-option>
					</el-select>
					<el-form-item>
						<el-button type="primary" @click="algorithmPage">查询</el-button>
					</el-form-item>
					<el-form-item>
						<el-button type="primary" @click="prepareRandom">随机一题</el-button>
						<el-dialog title="随机一题" :visible.sync="randomFormVisible" style="width: 100%">
							<el-descriptions class="margin-top" title="随机选择的题目如下:" :column="3" border>
								<el-descriptions-item v-model="randomAlgorithmic.questionName">
									<template slot="label">题目名称</template>
									{{ randomAlgorithmic.questionName }}
								</el-descriptions-item>
								<el-descriptions-item>
									<template slot="label">力扣题号</template>
									{{ randomAlgorithmic.leetcodeNumber }}
								</el-descriptions-item>
								<el-descriptions-item show-overflow-tooltip>
									<template slot="label">力扣链接</template>
									<a :href="randomAlgorithmic.leetcodeLink" target="_blank">{{ randomAlgorithmic.leetcodeLink }}</a>
								</el-descriptions-item>
							</el-descriptions>
							<div slot="footer" class="dialog-footer">
								<el-button @click="randomFormVisible = false">取 消</el-button>
							</div>
						</el-dialog>
					</el-form-item>
					<el-form-item>
						<el-button type="primary" @click="prepareAdd">新增</el-button>
						<el-dialog title="新增算法问题" :visible.sync="dialogFormVisible" style="width: 100%">
							<el-form :model="form" class="custom-form">
								<el-form-item label="算法问题" :label-width="formLabelWidth" class="form-item">
									<el-input v-model="form.questionName" autocomplete="off" style="width: 100%"></el-input>
								</el-form-item>
								<el-form-item label="问题标签" :label-width="formLabelWidth" class="form-item">
									<el-select v-model="form.tag" multiple placeholder="请选择">
										<el-option v-for="item in allOptions" :key="item" :label="item" :value="item"></el-option>
									</el-select>
								</el-form-item>
								<el-form-item label="问题集" :label-width="formLabelWidth" class="form-item">
									<el-select v-model="form.questionType" placeholder="请选择">
										<el-option v-for="item in questionType" :key="item" :label="item" :value="item"></el-option>
									</el-select>
								</el-form-item>
								<el-form-item label="重要程度" :label-width="formLabelWidth" class="form-item">
									<el-input v-model="form.degreeOfImportance" autocomplete="off" style="width: 100%"></el-input>
								</el-form-item>
								<el-form-item label="难易程度" :label-width="formLabelWidth" class="form-item">
									<el-input v-model="form.degreeOfDifficulty" autocomplete="off" style="width: 100%"></el-input>
								</el-form-item>
								<el-form-item label="难易分数" :label-width="formLabelWidth" class="form-item">
									<el-input v-model="form.difficultyOfScore" autocomplete="off" style="width: 100%"></el-input>
								</el-form-item>
								<el-form-item label="力扣题号" :label-width="formLabelWidth" class="form-item">
									<el-input v-model="form.leetcodeNumber" autocomplete="off" style="width: 100%"></el-input>
								</el-form-item>
								<el-form-item label="力扣链接" :label-width="formLabelWidth" class="form-item">
									<el-input v-model="form.leetcodeLink" autocomplete="off" style="width: 100%"></el-input>
								</el-form-item>
							</el-form>
							<div slot="footer" class="dialog-footer">
								<el-button @click="dialogFormVisible = false">取 消</el-button>
								<el-button type="primary" @click="handleConfirm(0)">确 定</el-button>
							</div>
						</el-dialog>
					</el-form-item>
					<el-form-item>
						<el-button type="primary" @click="prepareMutiAdd">批量新增</el-button>
						<el-dialog class="red-title" :visible.sync="dialogMutiFormVisible">
							<div class="red-title" slot="title">批量新增算法问题(多个问题换行填写)</div>
							<el-form :model="form" class="custom-form">
								<el-form-item label="算法问题" :label-width="formLabelWidth" class="form-item">
									<el-input type="textarea" v-model="form.questionName" autocomplete="off" :rows="5" :cols="30" style="width: 100%"></el-input>
								</el-form-item>
							</el-form>
							<div slot="footer" class="dialog-footer">
								<el-button @click="dialogMutiFormVisible = false">取 消</el-button>
								<el-button type="primary" @click="handleConfirm(1)">确 定</el-button>
							</div>
						</el-dialog>
					</el-form-item>
				</el-form>
				<el-table border :data="algorithmicList" v-loading="loading">
					<el-table-column prop="id" label="序号" sortable width="80"></el-table-column>
					<el-table-column align="center" prop="questionName" label="算法问题" show-overflow-tooltip>
						<template slot-scope="scope">
							<a :href="scope.row.leetcodeLink" target="_blank">{{ scope.row.questionName }}</a>
						</template>
					</el-table-column>
					<el-table-column prop="leetcodeNumber" label="力扣题号" width="100" show-overflow-tooltip></el-table-column>

					<el-table-column prop="tags" label="标签" width="150px" show-overflow-tooltip>
						<template slot-scope="scope">
							<div class="tag-flex">
								<div :style="{ 'margin-left': index > 0 ? '2px' : '0', 'margin-bottom': '2px' }" v-for="(tag, index) in scope.row.tags" :key="index">
									<el-tag :type="getTagType(tag)">{{ tag }}</el-tag>
								</div>
							</div>
						</template>
					</el-table-column>

					<el-table-column prop="questionType" label="问题集" show-overflow-tooltip align="center">
						<template slot-scope="scope">
							<span :style="{ color: getColorForValue(scope.row.questionType) }" v-html="scope.row.questionType"></span>
						</template>
					</el-table-column>

					<el-table-column sortable prop="degreeOfImportance" label="重要程度" show-overflow-tooltip></el-table-column>
					<el-table-column prop="degreeOfDifficulty" label="难易程度" show-overflow-tooltip></el-table-column>
					<el-table-column prop="difficultyOfScore" label="难易分数" show-overflow-tooltip></el-table-column>

					<el-table-column label="创建时间">
						<template slot-scope="props">
							{{ props.row.createTime | dateFormat }}
						</template>
					</el-table-column>
					<el-table-column prop="操作" label="操作">
						<template slot-scope="props">
							<el-button type="success" @click.prevent="preEdit(props.row.id, props.row.questionName, props.row.questionType, props.row.tags, props.row.degreeOfImportance, props.row.degreeOfDifficulty, props.row.difficultyOfScore, props.row.leetcodeNumber, props.row.leetcodeLink)" width="200">编辑</el-button>
							<el-dialog title="编辑算法问题" :visible.sync="editVisible">
								<el-form :model="form">
									<el-form-item label="算法问题" :label-width="formLabelWidth" class="form-item">
										<el-input v-model="form.questionName" autocomplete="off" style="width: 100%"></el-input>
									</el-form-item>

									<el-form-item label="问题标签" :label-width="formLabelWidth" class="form-item">
										<el-select v-model="form.tag" multiple placeholder="请选择">
											<el-option v-for="item in allOptions" :key="item" :label="item" :value="item"></el-option>
										</el-select>
									</el-form-item>

									<el-form-item label="问题集" :label-width="formLabelWidth" class="form-item">
										<el-select v-model="form.questionType" placeholder="请选择">
											<el-option v-for="item in questionType" :key="item" :label="item" :value="item"></el-option>
										</el-select>
									</el-form-item>

									<el-form-item label="重要程度" :label-width="formLabelWidth" class="form-item">
										<el-input v-model="form.degreeOfImportance" autocomplete="off" style="width: 100%"></el-input>
									</el-form-item>
									<el-form-item label="难易程度" :label-width="formLabelWidth" class="form-item">
										<el-input v-model="form.degreeOfDifficulty" autocomplete="off" style="width: 100%"></el-input>
									</el-form-item>
									<el-form-item label="难易分数" :label-width="formLabelWidth" class="form-item">
										<el-input v-model="form.difficultyOfScore" autocomplete="off" style="width: 100%"></el-input>
									</el-form-item>
									<el-form-item label="力扣题号" :label-width="formLabelWidth" class="form-item">
										<el-input v-model="form.leetcodeNumber" autocomplete="off" style="width: 100%"></el-input>
									</el-form-item>
									<el-form-item label="力扣链接" :label-width="formLabelWidth" class="form-item">
										<el-input v-model="form.leetcodeLink" autocomplete="off" style="width: 100%"></el-input>
									</el-form-item>
								</el-form>
								<div slot="footer" class="dialog-footer">
									<el-button @click="editVisible = false">取 消</el-button>
									<el-button type="primary" @click="editConfirm">确 定</el-button>
								</div>
							</el-dialog>
							<el-button type="danger" @click="prepareDelete(props.row.id)">删除</el-button>
							<el-dialog title="提示" :visible.sync="dialogVisible" width="30%" :before-close="handleClose">
								<span>确认删除吗</span>
								<span slot="footer" class="dialog-footer">
									<el-button @click="dialogVisible = false">取 消</el-button>
									<el-button type="primary" @click.prevent="onDelete(currentRowId)">确 定</el-button>
								</span>
							</el-dialog>
						</template>
					</el-table-column>
				</el-table>
				<el-pagination class="pagination" background :key="elementui_page_component_key" :current-page.sync="currentPage" :page-size="pageSize" :total="total" @current-change="handleCurrentChange"></el-pagination>
			</el-main>
			<el-backtop class="backtop"></el-backtop>
		</el-container>
	</div>
</template>

<script>
import axios from 'axios'
export default {
    name: 'MyInterview',

    data() {
        return {
            // 用户列表数据
            algorithmicList: [],
            randomAlgorithmic: {
                questionName: '',
                leetcodeNumber: '',
                leetcodeLink: '',
            },
            loading: false,
            elementui_page_component_key: 0,
            currentPage: Number(localStorage.getItem('algorithmLastPage')) || 1,
            pageSize: 9,
            total: 0,
            formInline: {
                questionName: '',
                questionType: '',
                tag: [],
            },
            allOptions: ['hash表', '递归', '数组', '栈', '回溯', '双指针', '二分法', '滑动窗口', '动态规划', '链表', '二叉树', '组合'],
            questionType: ['HOT-100', '周赛', '网络'],
            // 新增的内容
            dialogFormVisible: false,
            randomFormVisible: false,
            dialogMutiFormVisible: false,
            form: {
                questionName: '',
                questionType: '',
                degreeOfImportance: 5,
                degreeOfDifficulty: 1,
                difficultyOfScore: 1200,
                leetcodeNumber: '',
                leetcodeLink: '',
                tag: [],
            },
            formLabelWidth: '120px',
            dialogVisible: false,
            editVisible: false,
            currentRowId: null,
            colorMap: {}, // 创建一个空的颜色映射关系对象
        }
    },
    watch: {
        formInline: {
            handler(newVal, oldVal) {
                this.currentPage = 1
                localStorage.setItem('algorithmLastPage', this.currentPage)
                this.algorithmPage()
            },
            deep: true,
        },
        // 监听currentPage的变化，将新值保存到localStorage中
        currentPage(newPage) {
            localStorage.setItem('algorithmLastPage', newPage.toString())
        },
    },
    created() {
        //获取问题类型的枚举
        this.algorithmPage()
    },
    mounted() {
        this.currentPage = 1
    },
    methods: {
        prepareAdd() {
            this.form.questionName = ''
            this.form.questionType = ''
            this.dialogFormVisible = true
        },
        prepareRandom() {
            this.randomAlgorithmic = []
            this.randomFormVisible = true
            this.interviewRandom()
        },
        prepareMutiAdd() {
            this.form.questionName = ''
            this.form.questionType = ''
            this.dialogMutiFormVisible = true
        },

        prepareDelete(id) {
            this.currentRowId = id
            this.dialogVisible = true
        },
        preEdit(id, questionName, questionType, tags, degreeOfImportance, degreeOfDifficulty, difficultyOfScore, leetcodeNumber, leetcodeLink) {
            this.form.questionName = questionName
            this.form.degreeOfImportance = degreeOfImportance
            this.form.degreeOfDifficulty = degreeOfDifficulty
            this.form.difficultyOfScore = difficultyOfScore
            this.form.leetcodeNumber = leetcodeNumber
            this.form.leetcodeLink = leetcodeLink
            this.form.questionType = questionType
            this.form.tag = tags
            this.currentRowId = id
            this.editVisible = true
        },
        handleClose(done) {
            this.$confirm('确认关闭？')
                .then((_) => {
                    done()
                })
                .catch((_) => {})
        },
        handleConfirm(addType) {
            this.dialogFormVisible = false // 关闭对话框
            this.dialogMutiFormVisible = false
            this.addQuestion(addType) // 发送请求
        },

        async algorithmPage() {
            this.loading = true
            const { data: res } = await axios.post('http://localhost:80/algorithmicProblem/page', {
                page: this.currentPage,
                pageSize: this.pageSize,
                questionName: this.formInline.questionName,
                questionType: this.formInline.questionType,
                tag: this.formInline.tag,
            })
            if (res.code === 200) {
                this.total = res.result.totalElements
                res.result.content.forEach((item) => {
                    item.tags = item && item.tag ? item.tag.split(',') : []
                })
                this.algorithmicList = res.result.content
            }
            this.loading = false
        },

        async addQuestion(addType) {
            try {
                this.loading = true
                const { data: res } = await axios.post('http://localhost:80/algorithmicProblem/add', {
                    addType: addType,
                    questionName: this.form.questionName,
                    questionType: this.form.questionType,
                    tag: this.form.tag,
                    degreeOfImportance: this.form.degreeOfImportance,
                    degreeOfDifficulty: this.form.degreeOfDifficulty,
                    difficultyOfScore: this.form.difficultyOfScore,
                    leetcodeNumber: this.form.leetcodeNumber,
                    leetcodeLink: this.form.leetcodeLink,
                })
                if (res.code === 200) {
                    this.currentPage = 1
                    this.form.questionName = ''
                    this.form.questionType = 0
                    this.form.degreeOfImportance = 5
                    this.form.degreeOfDifficulty = 1
                    this.form.difficultyOfScore = 1200
                    this.form.leetcodeNumber = ''
                    this.form.leetcodeLink = ''
                    this.form.tag = []
                    this.algorithmPage()
                } else {
                    console.error('Received non-200 status code', res)
                    this.errorMsg(res.message)
                }
            } catch (error) {
                console.error('An error occurred while adding the questionName:', error)
                // 异常处理逻辑
            } finally {
                this.loading = false
            }
        },

        async editConfirm() {
            try {
                this.loading = true
                const { data: res } = await axios.post('http://localhost:80/algorithmicProblem/update', {
                    id: this.currentRowId,
                    questionName: this.form.questionName,
                    questionType: this.form.questionType,
                    degreeOfImportance: this.form.degreeOfImportance,
                    degreeOfDifficulty: this.form.degreeOfDifficulty,
                    difficultyOfScore: this.form.difficultyOfScore,
                    leetcodeNumber: this.form.leetcodeNumber,
                    leetcodeLink: this.form.leetcodeLink,
                    tag: this.form.tag,
                })
                if (res.code === 200) {
                    this.form.questionName = ''
                    this.form.questionType = 0
                    this.editVisible = false
                    currentRowId: null
                    this.algorithmPage()
                } else {
                    console.error('Received non-200 status code', res)
                }
            } catch (error) {
                console.error('An error occurred while adding the questionName:', error)
                // 异常处理逻辑
            } finally {
                this.loading = false
            }
        },

        async onDelete(id) {
            this.dialogVisible = false
            this.loading = true
            const { data: res } = await axios.get('http://localhost:80/algorithmicProblem/delete', {
                params: {
                    id: id,
                },
            })
            this.algorithmPage()
            this.loading = false
        },
        refreshPage() {
            //获取问题类型的枚举
            this.algorithmPage()
            location.reload()
        },

        async interviewRandom() {
            this.loading = true
            const { data: res } = await axios.get('http://localhost:80/algorithmicProblem/random', { params: {} })
            if (res.code === 200) {
                this.randomAlgorithmic.questionName = res.result.questionName
                this.randomAlgorithmic.leetcodeNumber = res.result.leetcodeNumber
                this.randomAlgorithmic.leetcodeLink = res.result.leetcodeLink
            }
            this.loading = false
        },
        handleCurrentChange(currentPage) {
            this.currentPage = currentPage
            this.algorithmPage()
        },
        getColorForValue(value) {
            // 检查颜色映射关系中是否已经有该值对应的颜色
            if (!this.colorMap[value]) {
                // 如果没有，随机生成一个颜色并将其关联到该值
                this.colorMap[value] = this.getRandomColor()
            }
            // 返回值对应的颜色
            return this.colorMap[value]
        },
        getTagType(tag) {
            switch (tag.trim()) {
                case '链表':
                case '二叉树':
                case '栈':
                case '数组':
                    return 'primary'
                case 'hash表':
                case '回溯':
                case '双指针':
                case '二分法':
                    return 'success'
                case '滑动窗口':
                case '动态规划':
                    return 'danger'
                case '组合':
                    return 'warning'
                default:
                    return 'info'
            }
        },
        getRandomColor() {
            // 从颜色数组中随机选取一个颜色
            const colorArray = [
                'red',
                'blue',
                'green',
                'purple',
                'orange',
                'pink',
                'brown',
                'magenta',
                'maroon',
                'navy',
                'olive',
                'teal',
                'silver',
                'gray',
                'indigo',
                'violet',
                'coral',
                'salmon',
                'orchid',
                'slategray',
                'thistle',
                'burlywood',
                'cadetblue',
                'chocolate',
                'crimson',
                'darkblue',
                'darkcyan',
                'darkgoldenrod',
                'darkgray',
                'darkgreen',
                'darkkhaki',
                'darkmagenta',
                'darkolivegreen',
                'darkorange',
                'darkorchid',
                'darkred',
                'darksalmon',
                'darkseagreen',
                'darkslateblue',
                'darkslategray',
                'darkturquoise',
                'darkviolet',
                'deeppink',
                'deepskyblue',
                'dodgerblue',
                'firebrick',
                'forestgreen',
                'fuchsia',
                'hotpink',
                'indianred',
                'lightcoral',
                'lightpink',
                'lightsalmon',
                'lightseagreen',
                'lightskyblue',
                'lightslategray',
                'lightsteelblue',
                'mediumaquamarine',
                'mediumblue',
                'mediumorchid',
                'mediumpurple',
                'mediumslateblue',
                'mediumturquoise',
                'mediumvioletred',
                'midnightblue',
                'orangered',
                'palevioletred',
                'peru',
                'rosybrown',
                'saddlebrown',
                'seagreen',
                'sienna',
                'skyblue',
                'slateblue',
                'tan',
                'thistle',
                'tomato',
                'violet',
            ]
            const randomIndex = Math.floor(Math.random() * colorArray.length)
            return colorArray[randomIndex]
        },
        errorMsg(msg) {
            this.$message({
                showClose: true,
                message: msg,
                type: 'error',
            })
        },
    },
}
</script>

<style lang="less" scoped>
.el-header {
	background-color: #b3c0d1;
	color: #333;
	line-height: 60px;
}

.el-aside {
	color: #333;
}

.pagination {
	margin-top: 16px;
	text-align: right;
}

.header-button-item {
	margin-right: 15px;
	font-size: 20px;
}

.red-title {
	line-height: 24px;
	font-size: 18px;
	color: red;
}

.backtop {
	position: fixed;
	bottom: 50px;
	right: 50px;
	height: 40px;
	width: 40px;
	line-height: 40px;
	text-align: center;
	border-radius: 20px;
	background-color: #007aff;
	color: #fff;
	cursor: pointer;
	z-index: 999;
}

.custom-textarea {
	width: 100%;
	text-align: left;
}

.backtop:hover {
	background-color: #0050a0;
}

.tag-flex {
	display: flex;
	width: 150px;
	flex-wrap: wrap;
}
</style>