<!--
 * @Descripttion: 机房表单组件
 * @Author: (admin)
 * @Date: (2025-01-16)
-->
<template>
  <el-dialog :title="title" :lock-scroll="false" v-model="dialogVisible" @close="handleClose">
    <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
      <el-row :gutter="20">
        <el-col :lg="12">
          <el-form-item label="机房名称" prop="roomName">
            <el-input v-model="form.roomName" :disabled="isView" placeholder="请输入机房名称" />
          </el-form-item>
        </el-col>

        <el-col :lg="12">
          <el-form-item label="所属部门" prop="deptId">
            <el-tree-select
              v-model="form.deptId"
              :data="deptOptions"
              :disabled="isView"
              :props="{ value: 'id', label: 'label', children: 'children' }"
              value-key="id"
              placeholder="请选择所属部门"
              check-strictly
              :render-after-expand="false" />
          </el-form-item>
        </el-col>

        <el-col :lg="24">
          <el-form-item label="机房位置" prop="roomAddress">
            <el-input v-model="form.roomAddress" :disabled="isView" placeholder="请输入机房位置" />
          </el-form-item>
        </el-col>

        <el-col :lg="24">
          <el-form-item label="机架数量" prop="racksCount">
            <el-input v-model.number="form.racksCount" :disabled="isView" placeholder="请输入机架数量" />
          </el-form-item>
        </el-col>

        <el-col :lg="24">
          <el-form-item label="备注" prop="remarks">
            <el-input v-model="form.remarks" :disabled="isView" placeholder="请输入备注" />
          </el-form-item>
        </el-col>

        <!-- 查看模式下显示时间信息 -->
        <template v-if="isView && isEdit">
          <el-col :lg="12">
            <el-form-item label="创建时间">
              <el-input v-model="form.createdAt" disabled />
            </el-form-item>
          </el-col>
          <el-col :lg="12">
            <el-form-item label="修改时间">
              <el-input v-model="form.updatedAt" disabled />
            </el-form-item>
          </el-col>
        </template>
      </el-row>
    </el-form>

    <template #footer v-if="!isView">
      <el-button text @click="handleClose">{{ $t('btn.cancel') }}</el-button>
      <el-button type="primary" :loading="submitLoading" @click="submitForm">{{ $t('btn.submit') }}</el-button>
    </template>

    <template #footer v-else>
      <el-button text @click="handleClose">{{ $t('btn.close') }}</el-button>
    </template>
  </el-dialog>
</template>

<script setup name="odfRoomForm">
import { addOdfRooms, updateOdfRooms, getOdfRooms } from '@/api/business/odfrooms.js'
import { treeselect } from '@/api/system/dept'

const props = defineProps({
  visible: {
    type: Boolean,
    default: false
  },
  id: {
    type: [String, Number],
    default: null
  },
  mode: {
    type: String,
    default: 'edit', // 'add', 'edit', 'view'
    validator: (value) => ['add', 'edit', 'view'].includes(value)
  }
})

const emit = defineEmits(['update:visible', 'success'])

const { proxy } = getCurrentInstance()
const formRef = ref()
const submitLoading = ref(false)
const deptOptions = ref([])

// 计算属性
const dialogVisible = computed({
  get: () => props.visible,
  set: (value) => emit('update:visible', value)
})

const isEdit = computed(() => !!props.id)
const isView = computed(() => props.mode === 'view')
const title = computed(() => {
  if (props.mode === 'view') return '查看机房'
  return isEdit.value ? '修改机房' : '添加机房'
})

// 表单数据
const form = ref({
  id: null,
  deptId: 0,
  deptName: null,
  roomName: null,
  roomAddress: null,
  racksCount: null,
  remarks: null,
  createdAt: null,
  updatedAt: null
})

// 表单验证规则
const rules = {
  roomName: [{ required: true, message: '机房名称不能为空', trigger: 'blur' }]
}

// 获取部门树数据
function getDeptTreeData() {
  treeselect().then((response) => {
    deptOptions.value = [{ id: 0, label: '未知部门', children: [] }, ...response.data]
  })
}

// 重置表单
function resetForm() {
  form.value = {
    id: null,
    deptId: 0,
    deptName: null,
    roomName: null,
    roomAddress: null,
    racksCount: null,
    remarks: null,
    createdAt: null,
    updatedAt: null
  }
  nextTick(() => {
    proxy.resetForm('formRef')
  })
}

// 加载数据
function loadData() {
  if (props.id) {
    getOdfRooms(props.id).then((res) => {
      const { code, data } = res
      if (code == 200) {
        form.value = { ...data }
      }
    })
  } else {
    resetForm()
  }
}

// 提交表单
function submitForm() {
  proxy.$refs['formRef'].validate((valid) => {
    if (valid) {
      submitLoading.value = true

      if (isEdit.value) {
        updateOdfRooms(form.value)
          .then((res) => {
            proxy.$modal.msgSuccess('修改成功')
            handleSuccess()
          })
          .finally(() => {
            submitLoading.value = false
          })
      } else {
        addOdfRooms(form.value)
          .then((res) => {
            proxy.$modal.msgSuccess('新增成功')
            handleSuccess()
          })
          .finally(() => {
            submitLoading.value = false
          })
      }
    }
  })
}

// 成功处理
function handleSuccess() {
  dialogVisible.value = false
  emit('success')
}

// 关闭对话框
function handleClose() {
  dialogVisible.value = false
  resetForm()
}

// 监听对话框显示状态
watch(
  () => props.visible,
  (newVal) => {
    if (newVal) {
      getDeptTreeData()
      loadData()
    }
  }
)
</script>
