<template>
  <el-drawer
    :title="t('bomList.materialDetail')"
    :append-to-body="true"
    :model-value="modelValue"
    @update:model-value="$emit('update:modelValue', $event)"
    :show-close="false"
    direction="rtl"
    :size="computedSize"
    :before-close="handleClose"
  >
    <template v-if="nodeId">
      <div v-loading="loading" style="height: 100%">

        <div class="info-header">
          <div class="info-item">
            <span class="info-label">设备分类：</span>
            <span class="info-value">{{ rowInfo.deviceCategoryName }}</span>
          </div>
          <div class="separator"></div> <!-- 分隔线 -->
          <div class="info-item">
            <span class="info-label">BOM节点：</span>
            <span class="info-value">{{ rowInfo.bomNodeName }}</span>
          </div>
        </div>

        <el-table :data="materials" style="width: 100%" fit :row-style="{ height: '38px' }">
          <el-table-column prop="name" :label="t('workOrderMaterial.materialName')" min-width="150" show-overflow-tooltip/>
          <el-table-column prop="code" :label="t('workOrderMaterial.materialCode')" min-width="80" />
          <el-table-column prop="quantity" :label="t('route.quantity')" min-width="70" align="center">
            <template #default="scope">
              <el-form
                :model="scope.row"
                :rules="quantityRules"
                ref="quantityFormRef"
                @submit.prevent
              >
                <el-form-item prop="quantity" :error="scope.row.quantityError">
                  <el-input
                    v-model.number="scope.row.quantity"
                    type="number"
                    size="small"
                    placeholder="请输入数量"
                    @blur="clearQuantityError(scope.row)"
                    @keyup.enter="handleUpdate(scope.row)"
                    :class="{ 'error-input': scope.row.quantityError }"
                  />
                </el-form-item>
              </el-form>
            </template>
          </el-table-column>
          <el-table-column prop="unit" :label="t('workOrderMaterial.unit')" min-width="50" />
          <el-table-column
            :label="t('deviceList.createTime')"
            align="center"
            prop="createTime"
            min-width="110"
            :formatter="dateFormatter"
          />
          <el-table-column :label="t('maintain.operation')" width="180" fixed="right">
            <template #default="scope">
              <el-button
                size="small"
                type="success"
                :loading="scope.row.updating"
                @click="handleUpdate(scope.row)"
              >{{ t('iotDevice.update') }}</el-button>

              <el-button size="small" type="danger" @click="handleDelete(scope.row)"
                >{{ t('info.delete') }}</el-button
              >
            </template>
          </el-table-column>
        </el-table>
        <!-- 分页 -->
        <Pagination
          :total="total"
          v-model:page="queryParams.pageNo"
          v-model:limit="queryParams.pageSize"
          @pagination="loadMaterials(props.nodeId)"
        />
      </div>
    </template>
  </el-drawer>
</template>
<script setup lang="ts">
import { defineEmits, defineOptions, ref, watch } from 'vue'
import { ElMessage } from 'element-plus'
import * as DeviceMaterialApi from '@/api/pms/iotdevicematerial'
import { dateFormatter } from '@/utils/formatTime'
import {IotDeviceMaterialApi, IotDeviceMaterialVO} from "@/api/pms/iotdevicematerial";
const { t } = useI18n() // 国际化
const drawerVisible = ref<boolean>(false)
const emit = defineEmits(['update:modelValue', 'add', 'delete', 'refresh'])

const message = useMessage() // 消息弹窗

defineOptions({
  name: 'DeviceMaterialListDrawer'
})

const queryParams = reactive({
  pageNo: 1,
  pageSize: 10,
  createTime: [],
  deviceId: undefined,
  bomNodeId: '',
  name: '',
  code: ''
})

const quantityRules: FormRules = {
  quantity: [
    { required: true, message: '数量不能为空', trigger: 'blur' },
    {
      validator: (rule, value, callback) => {
        if (isNaN(value)) {
          callback(new Error('请输入有效数字'));
        } else if (value <= 0) {
          callback(new Error('数量必须大于0'));
        } else {
          callback();
        }
      },
      trigger: 'blur'
    }
  ]
};

const windowWidth = ref(window.innerWidth)
// 动态计算百分比
const computedSize = computed(() => {
  return windowWidth.value > 1200 ? '60%' : '80%'
})

const loading = ref(false)
const total = ref(0) // 列表的总页数
const materials = ref([])

const props = defineProps({
  modelValue: Boolean,
  nodeId: Number,
  deviceId: Number,
  rowInfo: {  // 新增props
    type: Object,
    default: () => ({
      deviceCategoryName: '',
      bomNodeName: ''
    })
  }
})

// 监听bom树节点ID变化
watch(
  () => props.nodeId,
  async (newVal) => {
    if (newVal) {
      await loadMaterials(newVal)
    }
  }
)

// 加载指定bom节点下的物料数据
const loadMaterials = async (nodeId) => {
  queryParams.bomNodeId = nodeId
  queryParams.deviceId = props.deviceId
  queryParams.pageNo = 1
  try {
    loading.value = true
    // API调用
    const data = await DeviceMaterialApi.IotDeviceMaterialApi.getIotDeviceMaterialPage(queryParams)
    materials.value = data.list.map(item => ({
      ...item,
      updating: false, // 更新状态标记
      quantityError: '' // 错误状态标记
    }))
    total.value = data.total
  } catch (error) {
    ElMessage.error('数据加载失败')
  } finally {
    loading.value = false
  }
}

/** 清除数量错误状态 */
const clearQuantityError = (row: IotDeviceMaterialVO) => {
  // 延迟清除错误状态，避免在验证过程中清除
  setTimeout(() => {
    row.quantityError = '';
  }, 100);
}

/** 更新物料数据 */
const handleUpdate = async (row: IotDeviceMaterialVO) => {
  try {
    if (isNaN(row.quantity)) {
      row.quantityError = '请输入有效数字';
      ElMessage.warning('请输入有效的数字');
      return;
    }

    if (row.quantity <= 0) {
      row.quantityError = '数量必须大于0';
      ElMessage.warning('数量必须大于0');
      return;
    }

    // 清除错误状态
    row.quantityError = '';

    // 设置更新状态
    row.updating = true
    // 构造更新参数
    const updateParams = {
      ...row,
      bomNodeId: props.nodeId
    }
    // 调用更新接口
    await DeviceMaterialApi.IotDeviceMaterialApi.updateIotDeviceMaterial(updateParams)
    // 更新成功反馈
    message.success('数量更新成功')
    // 可选：刷新父组件数据
    // emit('refresh')
  } catch (error) {
    ElMessage.error('更新失败')
  } finally {
    row.updating = false
  }
}

// 打开抽屉
const openDrawer = () => {
  drawerVisible.value = true
}

// 关闭抽屉
const closeDrawer = () => {
  drawerVisible.value = false
}

/** 删除设备BOM节点已经挂载的物料 */
const handleDelete = async (row) => {
  try {
    // 删除的二次确认
    await message.delConfirm()
    // 发起删除
    await DeviceMaterialApi.IotDeviceMaterialApi.deleteDeviceMaterial(props.nodeId, row.code)
    message.success(t('common.delSuccess'))
    // 刷新列表
    loadMaterials(props.nodeId)
  } catch {}
}

// 关闭抽屉
const handleClose = () => {
  emit('update:modelValue', false)
  emit('refresh') // 添加刷新事件
  materials.value = []
}

defineExpose({ openDrawer, closeDrawer, loadMaterials }) // 暴露方法给父组件
</script>

<style lang="scss" scoped>

/* 添加表格样式优化 */
.el-table {
  :deep(.cell) {
    white-space: nowrap;  /* 防止单元格内容换行 */
  }

  /* 表头样式 */
  :deep(th.el-table__cell) {
    background-color: #f5f7fa;
    font-weight: bold;
    color: #606266;
  }
}

/* 优化输入框样式 */
.el-input {
  width: 80px;

  :deep(.el-input__inner) {
    text-align: center;
    padding: 0 5px;
  }
  &.error-input :deep(.el-input__inner) {
    border-color: #f56c6c;
    background-color: #fff6f7;
  }
}

/* 错误提示样式 */
:deep(.el-form-item__error) {
  position: absolute;
  top: 100%;
  left: 0;
  padding-top: 2px;
  font-size: 12px;
  line-height: 1;
  color: #f56c6c;
  white-space: nowrap;
}

/* 更新按钮自定义样式 */
.el-button--success {
  background-color: #e8f5e9;
  border-color: #c8e6c9;
  color: #2e7d32;

  &:hover {
    background-color: #c8e6c9;
  }
}

.info-header {
  display: flex;
  align-items: center;
  padding: 18px 24px;
  background-color: #f5f7fa;
  border-bottom: 1px solid #ebeef5;
  margin-bottom: 20px;

  .info-item {
    flex: 1; /* 平分宽度 */
    display: flex;
    align-items: center; /* 垂直居中 */
  }

  .separator {
    width: 1px;
    height: 40px;
    background-color: #dcdfe6;
    margin: 0 24px;
  }

  .info-label {
    font-weight: bold;
    color: #606266;
    margin-right: 8px; /* 标签和值之间的间距 */
    font-size: 14px;
    white-space: nowrap; /* 防止标签换行 */
  }

  .info-value {
    color: #303133;
    font-size: 16px;
    font-weight: 500;
    white-space: nowrap; /* 防止值换行 */
    overflow: hidden;
    text-overflow: ellipsis; /* 超出部分显示省略号 */
  }
}
</style>
