<template>
	<div>
		<el-container>
			<el-main>
				<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.questionType" placeholder="请选择活动区域">
								<el-option v-for="item in allOptions" :key="item.questionType" :label="item.name" :value="item.questionType"></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-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-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 :inline="true" :model="formInline" class="demo-form-inline">
					<el-form-item>
						<el-input clearable v-model="formInline.questionName" placeholder="请输入问题" @keydown.enter.native="interviewPage"></el-input>
					</el-form-item>
					<el-select v-model="questionType" placeholder="请选择" @change="interviewPage">
						<el-option v-for="item in options" :key="item.questionType" :label="item.name" :value="item.questionType"></el-option>
					</el-select>
					<el-form-item>
						<el-button type="primary" @click="interviewPage">查询</el-button>
					</el-form-item>
					<el-form-item>
						<el-button type="primary" @click="prepareRandom">随机一题</el-button>
					</el-form-item>
					<el-form-item>
						<el-button type="primary" @click="prepareAdd">新增</el-button>
					</el-form-item>
					<el-form-item>
						<el-button type="primary" @click="prepareMutiAdd">批量新增</el-button>
					</el-form-item>
				</el-form>
				<el-table border :data="algorithmicList" v-loading="loading">
					<el-table-column prop="id" label="序号" width="80" sortable></el-table-column>
					<el-table-column prop="questionName" label="算法问题" show-overflow-tooltip></el-table-column>
					<el-table-column prop="questionTypeName" label="问题类型" show-overflow-tooltip align="center">
						<template slot-scope="scope">
							<span :style="{ color: getColorForValue(scope.row.questionTypeName) }" v-html="scope.row.questionTypeName"></span>
						</template>
					</el-table-column>
					<el-table-column prop="degreeOfImportance" label="重要程度" show-overflow-tooltip :width="50"></el-table-column>
					<el-table-column prop="degreeOfDifficulty" label="难易程度" show-overflow-tooltip :width="50"></el-table-column>
					<el-table-column prop="difficultyOfScore" label="难易分数" show-overflow-tooltip :width="80"></el-table-column>
					<el-table-column prop="leetcodeNumber" label="力扣题号" show-overflow-tooltip :width="50"></el-table-column>
					<el-table-column label="力扣链接" show-overflow-tooltip>
						<template slot-scope="scope">
							<a :href="scope.row.leetcodeLink" target="_blank">{{ scope.row.leetcodeLink }}</a>
						</template>
					</el-table-column>
					<el-table-column label="创建时间" width="170">
						<template slot-scope="props">
							{{ props.row.createTime | dateFormat }}
						</template>
					</el-table-column>
					<el-table-column prop="操作" label="操作" width="180">
						<template slot-scope="props">
							<el-button type="success" @click.prevent="preEdit(props.row.id, props.row.questionName, props.row.questionTypeName, 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.questionType" placeholder="请选择活动区域">
											<el-option v-for="item in allOptions" :key="item.questionType" :label="item.name" :value="item.questionType"></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: '',
			},
			options: [],
			allOptions: [],
			questionType: 0,
			// 新增的内容
			dialogFormVisible: false,
			randomFormVisible: false,
			dialogMutiFormVisible: false,
			form: {
				questionName: '',
				questionType: 0,
				degreeOfImportance: 5,
				degreeOfDifficulty: 1,
				difficultyOfScore: 1200,
				leetcodeNumber: '',
				leetcodeLink: '',
			},
			formLabelWidth: '120px',
			dialogVisible: false,
			editVisible: false,
			currentRowId: null,
			colorMap: {}, // 创建一个空的颜色映射关系对象
		}
	},
	watch: {
		'formInline.questionName'(newVal, oldVal) {
			if (newVal !== oldVal) {
				this.currentPage = 1
				localStorage.setItem('algorithmLastPage', this.currentPage)
				this.getQuestionType()
			}
		},
		// 监听currentPage的变化，将新值保存到localStorage中
		currentPage(newPage) {
			localStorage.setItem('algorithmLastPage', newPage.toString())
		},
	},
	created() {
		//获取问题类型的枚举
		this.getQuestionType()
		//获取问题类型的枚举
		this.getAllQuestionType()
	},
	mounted() {
		this.currentPage = 1
	},
	methods: {
		prepareAdd() {
			this.form.questionName = ''
			this.form.questionType = 0
			this.dialogFormVisible = true
			//获取问题类型的枚举
			this.getAllQuestionType()
		},
		prepareRandom() {
			this.randomAlgorithmic = []
			this.randomFormVisible = true
			this.interviewRandom()
		},
		prepareMutiAdd() {
			this.form.questionName = ''
			this.form.questionType = 0
			this.dialogMutiFormVisible = true
		},

		prepareDelete(id) {
			this.currentRowId = id
			this.dialogVisible = true
		},
		preEdit(id, questionName, questionTypeName, 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

			// 定义一个映射（map）来存储 questionType 到 name 的转换
			const questionTypeToNameMap = {}
			this.options.forEach((option) => {
				questionTypeToNameMap[option.name] = option.questionType
			})
			this.form.questionType = questionTypeToNameMap[questionTypeName]
			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 addQuestion(addType) {
			try {
				this.loading = true
				const { data: res } = await axios.post('http://120.79.36.53:8888/algorithmicProblem/add', {
					addType: addType,
					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,
				})
				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.getQuestionType()
				} 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
			}
		},
		errorMsg(msg) {
			this.$message({
				showClose: true,
				message: msg,
				type: 'error',
			})
		},
		async editConfirm() {
			try {
				this.loading = true
				const { data: res } = await axios.post('http://120.79.36.53:8888/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,
				})
				if (res.code === 200) {
					this.form.questionName = ''
					this.form.questionType = 0
					this.editVisible = false
					currentRowId: null
					this.getQuestionType()
				} 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://120.79.36.53:8888/algorithmicProblem/delete', {
				params: {
					id: id,
				},
			})
			this.getQuestionType()
			this.loading = false
		},
		refreshPage() {
			//获取问题类型的枚举
			this.getQuestionType()
			location.reload()
		},

		async getQuestionType() {
			const { data: res } = await axios.get('http://120.79.36.53:8888/algorithmicProblem/questionType', { params: {} })
			if (res.code === 200) {
				this.options = res.result
				//获取问题列表
				this.interviewPage()
			}
		},

		async getAllQuestionType() {
			const { data: res } = await axios.get('http://120.79.36.53:8888/algorithmicProblem/allQuestionType', { params: {} })
			if (res.code === 200) {
				this.allOptions = res.result
			}
		},

		async interviewPage() {
			this.loading = true
			const { data: res } = await axios.get('http://120.79.36.53:8888/algorithmicProblem/page', {
				params: {
					page: this.currentPage,
					pageSize: this.pageSize,
					questionName: this.formInline.questionName,
					questionType: this.questionType,
				},
			})
			if (res.code === 200) {
				this.total = res.result.totalElements
				// 定义一个映射（map）来存储 questionType 到 name 的转换
				const questionTypeToNameMap = {}
				this.options.forEach((option) => {
					questionTypeToNameMap[option.questionType] = option.name
				})
				// 修改 algorithmicList 中的每一个元素，将 questionType 转换为 name
				res.result.content.forEach((item) => {
					item.questionTypeName = questionTypeToNameMap[item.questionType]
				})
				this.algorithmicList = res.result.content
			}
			this.loading = false
		},
		async interviewRandom() {
			this.loading = true
			const { data: res } = await axios.get('http://120.79.36.53:8888/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.getQuestionType()
		},
		getColorForValue(value) {
			// 检查颜色映射关系中是否已经有该值对应的颜色
			if (!this.colorMap[value]) {
				// 如果没有，随机生成一个颜色并将其关联到该值
				this.colorMap[value] = this.getRandomColor()
			}
			// 返回值对应的颜色
			return this.colorMap[value]
		},
		getRandomColor() {
			// 从颜色数组中随机选取一个颜色
			const colorArray = [
				'red',
				'blue',
				'green',
				'yellow',
				'purple',
				'orange',
				'pink',
				'brown',
				'cyan',
				'magenta',
				'maroon',
				'navy',
				'olive',
				'teal',
				'lime',
				'aqua',
				'silver',
				'gray',
				'white',
				'indigo',
				'violet',
				'lavender',
				'coral',
				'gold',
				'salmon',
				'turquoise',
				'orchid',
				'khaki',
				'slategray',
				'thistle',
				'burlywood',
				'cadetblue',
				'chartreuse',
				'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',
				'gold',
				'greenyellow',
				'hotpink',
				'indianred',
				'lawngreen',
				'lightcoral',
				'lightgreen',
				'lightpink',
				'lightsalmon',
				'lightseagreen',
				'lightskyblue',
				'lightslategray',
				'lightsteelblue',
				'mediumaquamarine',
				'mediumblue',
				'mediumorchid',
				'mediumpurple',
				'mediumseagreen',
				'mediumslateblue',
				'mediumspringgreen',
				'mediumturquoise',
				'mediumvioletred',
				'midnightblue',
				'orangered',
				'palegoldenrod',
				'palegreen',
				'paleturquoise',
				'palevioletred',
				'peru',
				'powderblue',
				'rosybrown',
				'saddlebrown',
				'seagreen',
				'sienna',
				'skyblue',
				'slateblue',
				'springgreen',
				'tan',
				'thistle',
				'tomato',
				'turquoise',
				'violet',
			]
			const randomIndex = Math.floor(Math.random() * colorArray.length)
			return colorArray[randomIndex]
		},
	},
}
</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;
}
</style>