<template>
  <div class="p-2">
    <el-card shadow="never" style="margin-top: 0">
      <!-- 审批按钮组件 -->
      <approvalButton
        @submitForm="submitForm"
        @approvalVerifyOpen="approvalVerifyOpen"
        @handleApprovalRecord="handleApprovalRecord"
        :buttonLoading="buttonLoading"
        :id="form.mailingApplyId"
        :status="form.flowStatus"
        :pageType="routeParams.type"
        :mode="false"
      >
        <el-button
          v-if="form.mailingApplyId && routeParams.type !== 'approval'"
          v-hasPermi="['oa/crm:crmMailingApply:edit']"
          type="success"
          @click="openSignTimeDialog"
          >更新签收时间</el-button
        >
      </approvalButton>
    </el-card>
    <el-card shadow="never" style="margin-top: 0">
      <el-form ref="mailingApplyFormRef" :model="form" :loading="buttonLoading" :disabled="!isFormEditable" :rules="rules" label-width="130px">
        <el-divider content-position="left">基本信息</el-divider>
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="邮寄申请编号" prop="mailingApplyCode">
              <el-input v-model="form.mailingApplyCode" placeholder="自动生成邮寄申请编号" readonly>
                <template #append>
                  <el-button type="primary" @click="generateMailingApplyCode" :disabled="isCodeGenerated">生成邮寄申请编号</el-button>
                </template>
              </el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="日期" prop="applicationDate">
              <el-date-picker
                clearable
                v-model="form.applicationDate"
                type="date"
                value-format="YYYY-MM-DD"
                placeholder="请选择日期"
                style="width: 100%"
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="经手人" prop="handlerId">
              <el-select v-model="form.handlerId" placeholder="选择经手人" filterable @change="onHandlerChange" style="width: 100%">
                <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="省份" prop="province">
              <el-input v-model="form.province" placeholder="请输入省份" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="重量" prop="weight">
              <el-input-number v-model="form.weight" :precision="2" :step="0.1" :min="0" placeholder="请输入重量" style="width: 100%">
                <template #append>kg</template>
              </el-input-number>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="发起邮寄类型" prop="mailingType">
              <el-select v-model="form.mailingType" placeholder="请选择邮寄类型" style="width: 100%">
                <el-option v-for="dict in mailing_type" :key="dict.value" :label="dict.label" :value="dict.value" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="邮寄费用" prop="mailingFee">
              <el-input-number v-model="form.mailingFee" :precision="2" :step="1" :min="0" placeholder="请输入邮寄费用" style="width: 100%">
                <template #append>元</template>
              </el-input-number>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="快递单号" prop="expressNo">
              <el-input v-model="form.expressNo" placeholder="请输入快递单号" />
            </el-form-item>
          </el-col>
        </el-row>

        <el-divider content-position="left">邮寄物品及事由</el-divider>
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="邮寄物品信息及申请事由" prop="itemInfo" label-width="180px">
              <el-input v-model="form.itemInfo" type="textarea" :rows="4" placeholder="请输入邮寄物品信息及申请事由" />
            </el-form-item>
          </el-col>
        </el-row>

        <el-divider content-position="left">附件及关联项目</el-divider>
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="附件图片" prop="ossId">
              <file-upload
                v-model="ossFileModel"
                :limit="5"
                :file-type="['png', 'jpg', 'jpeg', 'gif']"
                :disabled="routeParams.type === 'view' || routeParams.type === 'approval'"
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="项目名称" prop="projectId">
              <el-input v-model="form.projectName" placeholder="点击选择项目" readonly @click="openProjectSelect">
                <template #append>
                  <el-button icon="Search" @click="openProjectSelect" />
                </template>
              </el-input>
              <el-button
                v-if="form.projectId && !(routeParams.type === 'view' || routeParams.type === 'approval')"
                link
                type="danger"
                @click="clearProjectSelect"
                style="margin-left: 8px"
              >
                清空
              </el-button>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="项目号" prop="projectCode">
              <el-input v-model="form.projectCode" placeholder="自动填充" disabled />
            </el-form-item>
          </el-col>
        </el-row>

        <el-divider content-position="left">物流信息</el-divider>
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="物流状态" prop="logisticsStatus">
              <el-select v-model="form.logisticsStatus" placeholder="请选择物流状态" style="width: 100%">
                <el-option v-for="dict in logistics_status" :key="dict.value" :label="dict.label" :value="dict.value" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="邮寄时间" prop="mailingTime">
              <el-date-picker
                clearable
                v-model="form.mailingTime"
                type="datetime"
                value-format="YYYY-MM-DD HH:mm:ss"
                placeholder="请选择邮寄时间"
                style="width: 100%"
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="签收时间" prop="signTime">
              <el-date-picker
                clearable
                v-model="form.signTime"
                type="datetime"
                value-format="YYYY-MM-DD HH:mm:ss"
                placeholder="请选择签收时间"
                style="width: 100%"
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="备注" prop="remark">
              <el-input v-model="form.remark" placeholder="请输入备注" />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </el-card>

    <!-- 审批验证组件 -->
    <SubmitVerify ref="submitVerifyRef" :task-variables="taskVariables" @submit-callback="submitCallback" />
    <!-- 审批记录组件 -->
    <ApprovalRecord ref="approvalRecordRef" />
    <!-- 更新签收时间弹窗 -->
    <el-dialog title="更新签收时间" v-model="signTimeDialog.visible" width="420px" append-to-body>
      <el-form label-width="100px">
        <el-form-item label="签收时间">
          <el-date-picker
            clearable
            v-model="signTimeForm.signTime"
            type="datetime"
            value-format="YYYY-MM-DD HH:mm:ss"
            placeholder="请选择签收时间"
            style="width: 100%"
          />
        </el-form-item>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="signTimeDialog.visible = false">取消</el-button>
          <el-button type="primary" :loading="signTimeDialog.loading" @click="submitSignTime">保存</el-button>
        </div>
      </template>
    </el-dialog>
    <!-- 项目选择弹窗 -->
    <ProjectSelect ref="projectSelectRef" :multiple="false" @confirm-call-back="projectSelectCallback" />
  </div>
</template>

<script setup name="CrmMailingApplyEdit" lang="ts">
import {
  addCrmMailingApply,
  getCrmMailingApply,
  mailingApplySubmitAndFlowStart,
  updateCrmMailingApply,
  updateCrmMailingApplySignTime
} from '@/api/oa/crm/crmMailingApply';
import { CrmMailingApplyForm } from '@/api/oa/crm/crmMailingApply/types';
import { getUserList } from '@/api/system/user';
import ProjectSelect from '@/components/ProjectSelect/index.vue';
import { getRuleGenerateCode } from '@/api/system/codeRule';
import { CodeRuleEnum, FlowCodeEnum } from '@/enums/OAEnum';
import { getInfo } from '@/api/login';
import SubmitVerify from '@/components/Process/submitVerify.vue';
import ApprovalRecord from '@/components/Process/approvalRecord.vue';
import approvalButton from '@/components/Process/approvalButton.vue';
import { useUserStore } from '@/store/modules/user';

const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { mailing_type, logistics_status, mailing_apply_status, wf_business_status } = toRefs<any>(
  proxy?.useDict('mailing_type', 'logistics_status', 'mailing_apply_status', 'wf_business_status')
);

const router = useRouter();
const route = useRoute();
const userStore = useUserStore();

const mailingApplyFormRef = ref<ElFormInstance>();
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
const projectSelectRef = ref<InstanceType<typeof ProjectSelect>>();
const buttonLoading = ref(false);
const isCodeGenerated = ref(false);

// P0修复：计算属性控制表单是否可编辑（仅草稿状态且非update模式才可编辑）
const isFormEditable = computed(() => {
  // 查看模式或审批模式永远不可编辑
  if (routeParams.value.type === 'view' || routeParams.value.type === 'approval') {
    return false;
  }
  // 新增模式可编辑
  if (routeParams.value.type === 'add' || !form.value.mailingApplyId) {
    return true;
  }
  // 修改模式：仅草稿状态可编辑
  return form.value.mailingApplyStatus === '1';
});

const signTimeDialog = reactive({ visible: false, loading: false });
const signTimeForm = reactive<{ signTime: string | undefined }>({ signTime: undefined });

// 路由参数（统一使用query方式，与projectInfo保持一致）
const routeParams = ref<Record<string, any>>({});

// 任务变量
const taskVariables = ref<any>({});

// 用户列表
const userList = ref<any[]>([]);

// OSS 上传内部 v-model 中转，避免直接绑定到 form 的字段类型导致TS报错
const ossFileModel = ref<string | string[] | undefined>(undefined);

const initFormData: CrmMailingApplyForm = {
  mailingApplyId: undefined,
  mailingApplyCode: undefined,
  applicationDate: undefined,
  handlerId: undefined,
  handlerName: undefined,
  deptId: undefined,
  province: undefined,
  weight: undefined,
  mailingType: undefined,
  mailingFee: undefined,
  expressNo: undefined,
  itemInfo: undefined,
  projectId: undefined,
  projectCode: undefined,
  projectName: undefined,
  ossId: undefined,
  mailingApplyStatus: '1',
  flowStatus: undefined,
  logisticsStatus: undefined,
  mailingTime: undefined,
  signTime: undefined,
  remark: undefined,
  flowCode: undefined,
  variables: undefined,
  bizExt: undefined
};

const data = reactive<{ form: CrmMailingApplyForm; rules: any }>({
  form: { ...initFormData },
  rules: {
    applicationDate: [{ required: true, message: '申请日期不能为空', trigger: 'blur' }],
    handlerId: [{ required: true, message: '经手人不能为空', trigger: 'change' }],
    province: [{ required: true, message: '省份不能为空', trigger: 'blur' }],
    weight: [{ required: true, message: '重量不能为空', trigger: 'blur' }],
    mailingType: [{ required: true, message: '邮寄类型不能为空', trigger: 'change' }],
    mailingFee: [{ required: true, message: '邮寄费用不能为空', trigger: 'blur' }],
    itemInfo: [{ required: true, message: '邮寄物品信息及申请事由不能为空', trigger: 'blur' }],
    expressNo: [{ required: true, message: '快递单号不能为空', trigger: 'blur' }],
    logisticsStatus: [{ required: true, message: '物流状态不能为空', trigger: 'change' }],
    mailingTime: [{ required: true, message: '邮寄时间不能为空', trigger: 'change' }]
  }
});

const { form, rules } = toRefs(data);

/** 加载用户列表 */
const loadUserList = async () => {
  try {
    const res = await getUserList({} as any);
    userList.value = res.data;
  } catch (e) {
    userList.value = [];
  }
};

/** 打开项目选择弹窗 */
const openProjectSelect = () => {
  if (routeParams.value.type === 'view' || routeParams.value.type === 'approval') {
    return;
  }
  projectSelectRef.value?.open();
};

/** 项目选择回调 */
const projectSelectCallback = (selectedProjects: any[]) => {
  if (selectedProjects && selectedProjects.length > 0) {
    const project = selectedProjects[0];
    form.value.projectId = project.projectId;
    form.value.projectCode = project.projectCode;
    form.value.projectName = project.projectName;
  }
};

/** 清空项目选择 */
const clearProjectSelect = () => {
  if (routeParams.value.type === 'view' || routeParams.value.type === 'approval') {
    return;
  }
  form.value.projectId = undefined;
  form.value.projectCode = undefined;
  form.value.projectName = undefined;
};

watch(
  () => form.value.ossId,
  (val) => {
    ossFileModel.value = val as any;
  },
  { immediate: true }
);

watch(
  () => ossFileModel.value,
  (val) => {
    form.value.ossId = val as any;
  }
);

/** 经手人变更时自动填充姓名和部门 */
const onHandlerChange = (userId: number) => {
  const user = userList.value.find((u) => u.userId === userId);
  if (user) {
    form.value.handlerName = user.nickName;
    form.value.deptId = user.deptId;
  }
};

/** 生成邮寄申请编号 */
const generateMailingApplyCode = async () => {
  if (isCodeGenerated.value) return;
  try {
    const params = { codeRuleCode: CodeRuleEnum.MAILING_APPLY } as any;
    const res = await getRuleGenerateCode(params);
    form.value.mailingApplyCode = res.msg;
    if (form.value.mailingApplyCode) {
      isCodeGenerated.value = true;
      proxy?.$modal.msgSuccess('邮寄申请编号生成成功');
    }
  } catch (error) {
    console.error('生成邮寄申请编号失败:', error);
    proxy?.$modal.msgError('生成邮寄申请编号失败');
  }
};

/** 加载表单数据 */
const loadFormData = async () => {
  // 获取路由参数（兼容新旧路由）
  const id = (route.query.id as string | number) || (route.params.mailingApplyId as string | number);
  const type = (route.query.type as string) || (id && id !== '0' ? 'update' : 'add');
  routeParams.value = { ...route.query, id, type } as any;

  if (id && id !== '0' && (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval')) {
    const res = await getCrmMailingApply(id);
    Object.assign(form.value, res.data);
    if (form.value.mailingApplyCode) {
      isCodeGenerated.value = true;
    }
  } else {
    // 新增时生成编号并设置默认值
    await generateMailingApplyCode();
    form.value.applicationDate = new Date().toISOString().split('T')[0];
    // 默认设置当前登录用户为经手人（getUserList无权限时使用getInfo兜底部门信息）
    form.value.handlerId = userStore.userId;
    form.value.handlerName = userStore.nickname as any;
    try {
      const userInfoRes = await getInfo();
      const userVO = userInfoRes.data?.user;
      if (userVO) {
        form.value.handlerName = userVO.nickName;
        form.value.deptId = userVO.deptId;
      }
    } catch (e) {
      // 忽略异常：避免因权限/网络问题导致新增页不可用
    }
    onHandlerChange(userStore.userId as number);
  }
};

/** 审批验证组件打开 */
const approvalVerifyOpen = () => {
  submitVerifyRef.value?.openDialog(routeParams.value.taskId as any);
};

/** 审批记录 */
const handleApprovalRecord = () => {
  approvalRecordRef.value?.init(form.value.mailingApplyId);
};

/** 审批回调 */
const submitCallback = () => {
  proxy?.$modal.msgSuccess('操作成功');
  proxy?.$tab.closePage();
  router.go(-1);
};

const openSignTimeDialog = () => {
  signTimeForm.signTime = form.value.signTime as any;
  signTimeDialog.visible = true;
};

const submitSignTime = async () => {
  if (!form.value.mailingApplyId) {
    proxy?.$modal.msgError('请先保存单据');
    return;
  }
  signTimeDialog.loading = true;
  try {
    const res = await updateCrmMailingApplySignTime({ mailingApplyId: form.value.mailingApplyId, signTime: signTimeForm.signTime } as any);
    form.value = res.data;
    proxy?.$modal.msgSuccess('签收时间更新成功');
    signTimeDialog.visible = false;
  } finally {
    signTimeDialog.loading = false;
  }
};

/** 提交表单 */
const submitForm = async (status: string, mode: boolean) => {
  if (!mailingApplyFormRef.value) {
    return;
  }

  if (routeParams.value.type !== 'view' && routeParams.value.type !== 'approval' && !form.value.mailingApplyCode) {
    await generateMailingApplyCode();
    if (!form.value.mailingApplyCode) {
      proxy?.$modal.msgError('邮寄申请编号生成失败，请稍后重试');
      return;
    }
  }

  try {
    if (status === 'draft') {
      await mailingApplyFormRef.value.validateField(['applicationDate', 'handlerId', 'province', 'weight', 'mailingType', 'mailingFee', 'itemInfo']);
    } else {
      await mailingApplyFormRef.value.validate();
    }
  } catch (e) {
    return;
  }

  buttonLoading.value = true;
  try {
    if (status !== 'draft') {
      form.value.flowCode = FlowCodeEnum.MAILING_APPLY_CODE;
      form.value.variables = {
        mailingApplyId: form.value.mailingApplyId,
        mailingApplyCode: form.value.mailingApplyCode,
        applicationDate: form.value.applicationDate,
        handlerId: form.value.handlerId,
        handlerName: form.value.handlerName,
        deptId: form.value.deptId,
        province: form.value.province,
        weight: form.value.weight,
        mailingType: form.value.mailingType,
        mailingFee: form.value.mailingFee,
        expressNo: form.value.expressNo,
        itemInfo: form.value.itemInfo,
        projectId: form.value.projectId,
        projectCode: form.value.projectCode,
        projectName: form.value.projectName,
        logisticsStatus: form.value.logisticsStatus,
        mailingTime: form.value.mailingTime,
        signTime: form.value.signTime,
        remark: form.value.remark,
        entity: { ...form.value }
      };
      form.value.bizExt = {
        businessTitle: '邮寄申请',
        businessCode: form.value.mailingApplyCode
      };

      const res = await mailingApplySubmitAndFlowStart(form.value);
      form.value = res.data;
      proxy?.$modal.msgSuccess('提交成功');
      proxy?.$tab.closePage();
      router.go(-1);
    } else {
      form.value.mailingApplyStatus = '1';
      form.value.flowStatus = 'draft';
      if (form.value.mailingApplyId) {
        await updateCrmMailingApply(form.value);
      } else {
        const res = await addCrmMailingApply(form.value);
        form.value = res.data;
      }
      proxy?.$modal.msgSuccess('暂存成功');
      // P1修复：暂存成功后关闭tab返回列表，与projectInfo保持一致
      proxy?.$tab.closePage();
      router.go(-1);
    }
  } finally {
    buttonLoading.value = false;
  }
};

onMounted(async () => {
  nextTick(async () => {
    proxy?.$modal.loading('正在加载数据，请稍后...');
    await loadUserList();
    await loadFormData();
    proxy?.$modal.closeLoading();
  });
});
</script>
