<template>
    <div class="app-container">
        <!-- 计划类别管理 -->
        <ComTable
            ref="comTableRef"
            :form-columns="formColumns"
            :table-columns="tableColumns"
            :load-data="listPlanCategoryAPI"
            :show-toolbar="true"
            :show-action="true"
            :action-columns="actionColumns"
            :default-query-params="{
                category: 2, // 0：计划专业  1：业务类型  2：计划类别
            }"
        >
            <!-- 工具栏插槽 -->
            <template #toolbar>
                <ComButton type="primary" icon="Plus" @click="onHandleAdd">新建计划类别</ComButton>
            </template>
        </ComTable>

        <ComDialog :dialog-config="dialogConfig" @closeDialogOuter="onCloseDialogOuter">
            <template #outerContent>
                <el-form
                    size="large"
                    label-width="auto"
                    :model="addAndEditForm"
                    ref="addAndEditFormRef"
                    :rules="addAndEditRules"
                >
                    <el-form-item label="计划类别名称" prop="planMajorName">
                        <el-input
                            clearable
                            maxlength="50"
                            show-word-limit
                            placeholder="请输入计划类别名称"
                            v-model.trim="addAndEditForm.planMajorName"
                        />
                    </el-form-item>
                    <el-form-item label="备注" prop="remark">
                        <el-input
                            type="textarea"
                            maxlength="200"
                            show-word-limit
                            placeholder="请输入备注"
                            v-model="addAndEditForm.remark"
                            :autosize="{ minRows: 4, maxRows: 8 }"
                        />
                    </el-form-item>
                </el-form>

                <el-row class="common-btn-row">
                    <ComButton plain type="info" @click="onHandleCancel">取消</ComButton>
                    <ComButton @click="onHandleSave">保存</ComButton>
                </el-row>
            </template>
        </ComDialog>
    </div>
</template>

<script setup name="Position">
import { ref, nextTick } from 'vue'
import {
    listPlanCategoryAPI,
    addPlanCategoryAPI,
    delPlanCategoryAPI,
    updatePlanCategoryAPI,
} from '@/api/basicManage/planCategory.js'
import { bus, BUS_EVENTS } from '@/utils/bus'
import config from './config'
import ComTable from '@/components/ComTable/index.vue'
import ComButton from '@/components/ComButton/index.vue'
import ComDialog from '@/components/ComDialog/index.vue'

const { formColumns, tableColumns, dialogConfig } = config
const { proxy } = getCurrentInstance()

const addAndEditFormRef = ref(null)
const comTableRef = ref(null)
const editId = ref(null)

// 定义初始表单数据函数
const getInitFormData = () => ({
    planMajorName: '',
    remark: '',
    category: 2,
})

const addAndEditForm = ref(getInitFormData())

const addAndEditRules = ref({
    planMajorName: [{ required: true, message: '请输入计划类别名称', trigger: 'blur' }],
})

const actionColumns = [
    {
        label: '编辑',
        type: 'primary',
        link: true,
        handler: (row) => {
            const { planMajorId, planMajorName, remark } = row
            editId.value = planMajorId
            dialogConfig.outerTitle = '编辑计划类别'
            dialogConfig.outerVisible = true
            // 使用 nextTick 确保在弹框渲染、表单组件挂载后再赋值
            nextTick(() => {
                addAndEditForm.value.planMajorName = planMajorName
                addAndEditForm.value.remark = remark
            })
        },
    },
    {
        label: '删除',
        type: 'danger',
        link: true,
        handler: (row) => {
            proxy.$modal.confirm('是否确认删除该计划类别？').then(async () => {
                const result = await delPlanCategoryAPI({
                    planMajorId: row.planMajorId,
                })
                if (result.code === 200) {
                    proxy.$modal.msgSuccess('删除成功')
                    comTableRef.value?.refresh() // 刷新表格
                    bus.emit(BUS_EVENTS.REFRESH_OPTIONS, 'planCategoryOptions') // 刷新类别下拉缓存
                }
            })
        },
    },
]

// 新增
const onHandleAdd = () => {
    editId.value = null
    dialogConfig.outerTitle = '新建计划类别'
    dialogConfig.outerVisible = true
    // 重置表单数据
    addAndEditForm.value = getInitFormData()
    // 清除之前的校验信息
    nextTick(() => {
        addAndEditFormRef.value?.clearValidate()
    })
}

// 取消
const onHandleCancel = () => {
    addAndEditFormRef?.value?.resetFields() // 重置表单
    dialogConfig.outerVisible = false
}

// 保存
const onHandleSave = async () => {
    try {
        await addAndEditFormRef.value.validate()
        const API = editId.value ? updatePlanCategoryAPI : addPlanCategoryAPI
        const params = JSON.parse(JSON.stringify(addAndEditForm.value))
        editId.value ? (params.planMajorId = editId.value) : null

        const result = await API(params)
        if (result.code === 200) {
            proxy.$modal.msgSuccess(editId.value ? '编辑成功' : '新增成功')
            addAndEditFormRef.value.resetFields() // 重置表单
            dialogConfig.outerVisible = false
            comTableRef.value?.refresh() // 刷新表格
            bus.emit(BUS_EVENTS.REFRESH_OPTIONS, 'planCategoryOptions') // 刷新类别下拉缓存
        }
    } catch (error) {
        console.error('表单校验失败或请求错误:', error)
        return Promise.reject(error)
    }
}

const onCloseDialogOuter = (visible) => {
    dialogConfig.outerVisible = visible
    if (!visible) {
        addAndEditFormRef.value?.resetFields()
    }
}
</script>
