<template>
  <div class="safety-platform-container">
    <header class="safety-platform-container__header">
      <BreadcrumbBack />
      <span class="breadcrumb-title">{{ headerTitle }}</span>
    </header>
    <TaskInfoSection :task-name="taskName" @export-loss-detail="exportLossDetail" v-if="!operate" />
    <main class="safety-platform-container__main">
      <component :is="dynamicComponent" :id="id" ref="dynamicComponentRef" />
    </main>
    <footer class="safety-platform-container__footer" v-if="operate">
      <el-button @click="router.back()">取消</el-button>
      <el-button type="primary" @click="submit">提交</el-button>
    </footer>
    <UploadLoading :form-loading="formLoading" v-if="formLoading" />
  </div>
</template>

<script lang="ts" setup>
  import { useRoute, useRouter } from 'vue-router';
  import { ref, computed, defineAsyncComponent } from 'vue';
  import { ElMessage } from 'element-plus';
  import UploadLoading from '@/components/UploadLoading.vue';
  import TaskInfoSection from './src/components/TaskInfoSection.vue';
  import { exportLossRecord } from '@/views/disaster/disaster-control/src/util';
  import type { DisposalManagementCreateQuery, DisasterReportEditQuery } from '@/types/disaster-control';
  import { createDisasterReportTask, editDisasterReportTask } from '@/api/disaster-control';

  const router = useRouter();
  const route = useRoute();
  const operate = route.query.operate;
  const id = Number(route.params.id);
  const taskName = String(route.query.taskName);
  const reportTaskId = Number(route.query.reportTaskId);
  const deptId = Number(route.query.deptId);
  const headerTitle = computed(() => {
    const fixedTitle = '灾害处置任务';
    if (operate === 'create') {
      return `创建${fixedTitle}`;
    } else if (operate === 'edit') {
      return `编辑${fixedTitle}`;
    }
    return '灾害损失记录明细';
  });
  const dynamicComponent = computed(() => {
    if (operate === 'create') {
      return defineAsyncComponent(() => import('./src/components/CreateDisposalManagementItem.vue'));
    } else if (operate === 'edit') {
      return defineAsyncComponent(() => import('./src/components/EditDisposalManagementItem.vue'));
    } else {
      return defineAsyncComponent(() => import('./src/components/ViewDisposalControlItem.vue'));
    }
  });
  const dynamicComponentRef = ref();
  const createDisposalManagementItemFunc = async (formData: DisposalManagementCreateQuery) => {
    await createDisasterReportTask({ handleTaskId: id, ...formData });
  };
  const editDisposalManagementItemFunc = async (formData: DisasterReportEditQuery) => {
    if (!reportTaskId) return;
    await editDisasterReportTask({ ...formData, id: reportTaskId, handleTaskId: id });
  };
  const formLoading = ref(false);
  const submit = async () => {
    if (!dynamicComponentRef.value) return;
    const res = await dynamicComponentRef.value.handleValidate();
    if (!res) return;
    formLoading.value = true;
    const formData = dynamicComponentRef.value.getFormData();
    let message;
    try {
      if (operate === 'create') {
        await createDisposalManagementItemFunc(formData);
        message = '创建成功';
      } else {
        await editDisposalManagementItemFunc(formData);
        message = '编辑成功';
      }
      ElMessage.success(message);
      router.back();
    } finally {
      formLoading.value = false;
    }
  };
  const exportLossDetail = async () => {
    await exportLossRecord({ handleTaskId: id, reportDeptId: deptId }, taskName);
    ElMessage.success(`导出${taskName}损失明细成功`);
  };
</script>

<style lang="scss" scoped>
  @use '@/styles/page-details-layout.scss' as *;
  @use './src/style/common.scss' as *;
</style>
