<template>
  <main class="safety-platform-container__main">
    <BasicForm
      ref="basicFormRef"
      :formData="ruleFormData"
      :formRules="isViewMode ? undefined : formRules"
      :formConfig="computedFormConfig"
    >
      <template #fileFormat>
        <el-radio-group v-model="ruleFormData.fileFormat" :disabled="isViewMode">
          <el-radio value="PDF">PDF</el-radio>
          <el-radio value="WORD">WORD</el-radio>
        </el-radio-group>
      </template>
      <template #fileUrl>
        <UploadFiles
          v-if="!isViewMode"
          label="上传文件"
          :maxCount="1"
          :file-list="ruleFormData.fileUrlList"
          :disabled="isViewMode"
          :allow-all-file-types="true"
          @uploadSuccess="(list: FileItem[]) => handleUploadSuccess(list)"
        />
        <div class="file-list" v-else>
          <div class="file-item" v-for="file in ruleFormData.fileUrlList" :key="file.fileId">
            <span class="file-item--name">{{ file.fileName }}</span>
            <div class="file-item--footer">
              <el-button link type="primary" @click="previewOnline(file.fileUrl, file.fileType)"
                >预览</el-button
              >
              <el-button link type="primary" @click.stop="downloadFile(file.fileUrl, file.fileName)"
                >下载</el-button
              >
            </div>
          </div>
        </div>
      </template>
      <template #content>
        <div class="editor-container" v-if="!isViewMode">
          <Toolbar 
            style="border-bottom: 1px solid #dcdfe6" 
            :editor="editorRef" 
          />
          <Editor
            style="height: 400px; overflow-y: auto"
            v-model="ruleFormData.content"
            mode="default"
            :defaultConfig="editorConfig"
            @on-created="handleEditorCreated"
            @on-change="handleEditorChange"
          />
        </div>
        <div v-html="ruleFormData.content" v-else></div>
      </template>
      <template #status>
        <el-radio-group v-model="ruleFormData.status" :disabled="isViewMode">
          <el-radio :value="1">启用</el-radio>
          <el-radio :value="0">禁用</el-radio>
        </el-radio-group>
      </template>
    </BasicForm>
    <PreviewOnline ref="previewOnlineRef" />
  </main>
  <footer class="safety-platform-container__footer">
    <el-button @click="router.back()">返回</el-button>
    <el-button v-if="!isViewMode" type="primary" @click="handleSubmit">
      {{ isCreateMode ? '提交' : '保存' }}
    </el-button>
  </footer>
</template>

<script setup lang="ts">
  import { computed, onMounted, ref, shallowRef, onBeforeUnmount } from 'vue';
  import { useRoute, useRouter } from 'vue-router';
  import { ElMessage } from 'element-plus';
  import BasicForm from '@/components/BasicForm.vue';
  import UploadFiles from '@/components/UploadFiles/UploadFiles.vue';
  import { Editor, Toolbar } from '@wangeditor/editor-for-vue';
  import '@wangeditor/editor/dist/css/style.css';
  import { useFormConfigHook } from '@/hooks/useFormConfigHook';
  import { DUAL_SYSTEM_FORM_CONFIG, DUAL_SYSTEM_FORM_DATA, DUAL_SYSTEM_FORM_RULES } from '../configs/form';
  import {
    queryDualSystemById,
    saveDualSystem,
    updateDualSystem,
    type ProductionSafetyFile,
  } from '@/api/production-safety-system';
  import type { FileItem } from '@/components/UploadFiles/types';
  import { formatAttachmentList } from '@/components/UploadFiles/utils';
  import PreviewOnline from '@/views/disaster/components/PreviewOnline.vue';
  import { downloadFile } from '@/views/disaster/utils';

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

  const operate = computed(() => (route.query.operate as string) || 'dual-system-create');
  const currentId = computed(() => Number(route.query.id));

  const isCreateMode = computed(() => operate.value === 'dual-system-create');
  const isEditMode = computed(() => operate.value === 'dual-system-edit');
  const isViewMode = computed(() => operate.value === 'dual-system-view');

  const previewOnlineRef = ref<InstanceType<typeof PreviewOnline>>();

  const { ruleFormData, formRules, ruleFormConfig, cloneRuleFormData, beforeRouteLeave } =
    useFormConfigHook(DUAL_SYSTEM_FORM_CONFIG, DUAL_SYSTEM_FORM_DATA, DUAL_SYSTEM_FORM_RULES);

  // 查看模式下，所有字段设为只读
  const viewFormConfig = ref(
    DUAL_SYSTEM_FORM_CONFIG.map((item) => ({
      ...item,
      componentProps: {
        ...item.componentProps,
        disabled: true,
      },
    })),
  );

  const computedFormConfig = computed(() => {
    if (isViewMode.value) {
      return viewFormConfig.value;
    }
    return ruleFormConfig.value;
  });

  const basicFormRef = ref<InstanceType<typeof BasicForm>>();
  
  // 富文本编辑器
  const editorRef = shallowRef();
  const editorConfig = computed(() => ({
    placeholder: '请输入文档内容',
    MENU_CONF: {},
  }));

  const handleEditorCreated = (editor: any) => {
    editorRef.value = editor;
  };

  const handleEditorChange = () => {
    // 编辑器内容变化时的处理
  };

  // 文件上传
  const handleUploadSuccess = (files: FileItem[]) => {
    ruleFormData.fileUrlList = files;
    ruleFormData.fileUrl = JSON.stringify(files) || '';
  };

  // 将逗号分隔的URL字符串转换为FileItem数组
  const convertFileUrlToFileItems = (fileUrl: string): FileItem[] => {
    if (!fileUrl || !fileUrl.trim()) {
      return [];
    }
    
    // 按逗号分割URL
    const urls = fileUrl.split(',').map(url => url.trim()).filter(url => url);
    
    return urls.map((url, index) => {
      // 从URL中提取文件名
      const urlParts = url.split('/');
      const fileName = urlParts[urlParts.length - 1] || `附件${index + 1}`;
      
      // 根据文件扩展名判断文件类型
      const extension = fileName.split('.').pop()?.toLowerCase() || '';
      let fileType = 'pdf';
      if (extension === 'doc' || extension === 'docx') {
        fileType = 'word';
      } else if (extension === 'xls' || extension === 'xlsx') {
        fileType = 'excel';
      } else if (extension === 'ppt' || extension === 'pptx') {
        fileType = 'ppt';
      }
      
      return {
        fileId: Date.now() + index,
        fileName,
        fileType,
        fileSize: '0',
        fileUrl: url,
      };
    });
  };

  const handleValidate = async () => {
    if (!basicFormRef.value) return;
    const res = await basicFormRef.value.validateForm();
    return res;
  };

  const getDetail = async () => {
    if (!currentId.value) return;
    try {
      const res = await queryDualSystemById(currentId.value);
      if (res) {
        // 映射接口字段到表单字段
        ruleFormData.fileName = res.fileName || '';
        ruleFormData.classifyName = res.classifyName || '';
        ruleFormData.fileCode = res.fileCode || '';
        ruleFormData.fileVersion = res.fileVersion || '';
        ruleFormData.fileFormat = res.fileFormat || '';
        ruleFormData.releaseDate = res.releaseDate || '';
        ruleFormData.fileUrl = res.fileUrl || '';
        ruleFormData.content = res.content || '';
        ruleFormData.status = res.status ?? 1;
        ruleFormData.fileUrlList = JSON.parse(res.fileUrl || '[]');
      }
      cloneRuleFormData();
    } catch (e) {
      console.error('获取双体系建设详情失败:', e);
      ElMessage.error('获取详情失败');
    }
  };

  const handleSubmit = async () => {
    const res = await handleValidate();
    if (!res) return;
    
    // 验证文件上传（必填）
    if (!ruleFormData.fileUrlList || ruleFormData.fileUrlList.length === 0) {
      ElMessage.warning('请上传文件');
      return;
    }
    
    try {
      // 处理文件上传：先上传文件获取 URL，然后提取 fileUrl
      // let fileUrl = '';
      // if (ruleFormData.fileUrlList && ruleFormData.fileUrlList.length > 0) {
      //   // 分离已有URL的文件和新上传的文件
      //   const existingFiles: string[] = [];
      //   const newFiles: FileItem[] = [];
        
      //   ruleFormData.fileUrlList.forEach((file: FileItem) => {
      //     // 如果文件已经有 fileUrl 且没有 file 对象，说明是已有文件
      //     if (file.fileUrl && !file.file) {
      //       existingFiles.push(file.fileUrl);
      //     } else {
      //       // 否则是需要上传的新文件
      //       newFiles.push(file);
      //     }
      //   });

      //   // 上传新文件
      //   let uploadedUrls: string[] = [];
      //   if (newFiles.length > 0) {
      //     const uploadedFiles = await formatAttachmentList(newFiles);
      //     uploadedUrls = uploadedFiles
      //       .map((file: any) => file.fileUrl || file.url || '')
      //       .filter((url: string) => url);
      //   }

      //   // 合并已有URL和新上传的URL，取第一个作为fileUrl
      //   const allUrls = [...existingFiles, ...uploadedUrls].filter((url: string) => url);
      //   fileUrl = allUrls.length > 0 ? allUrls[0] : '';
      // }

      const uploadedFileList = await formatAttachmentList(ruleFormData.fileUrlList);

      const basePayload: ProductionSafetyFile = {
        fileName: ruleFormData.fileName,
        classifyName: ruleFormData.classifyName,
        fileCode: ruleFormData.fileCode,
        fileVersion: ruleFormData.fileVersion,
        fileFormat: ruleFormData.fileFormat,
        releaseDate: ruleFormData.releaseDate,
        fileUrl: JSON.stringify(uploadedFileList) || undefined,
        content: ruleFormData.content || undefined,
        status: ruleFormData.status ?? 1,
      };

      if (isCreateMode.value) {
        await saveDualSystem(basePayload);
        ElMessage.success('创建成功');
      } else if (isEditMode.value && currentId.value) {
        await updateDualSystem({
          id: currentId.value,
          ...basePayload,
        });
        ElMessage.success('保存成功');
      }
      cloneRuleFormData();
      router.back();
    } catch (e) {
      console.error('保存双体系建设失败:', e);
      ElMessage.error('保存失败，请重试');
    }
  };

  const previewOnline = (url: string | undefined, type) => {
    if (url) {
      previewOnlineRef.value?.open(url, type);
    }
  };

  onMounted(() => {
    cloneRuleFormData();
    beforeRouteLeave();
    if (isEditMode.value || isViewMode.value) {
      getDetail();
    }
  });

  onBeforeUnmount(() => {
    const editor = editorRef.value;
    if (editor == null) return;
    editor.destroy();
  });
</script>

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

  .editor-container {
    width: 100%;
    border: 1px solid #dcdfe6;
    border-radius: 4px;
    overflow: hidden;
  }

  .content-display {
    min-height: 200px;
    padding: 12px;
    border: 1px solid #dcdfe6;
    border-radius: 4px;
    background-color: #f5f7fa;
  }

  .file-display {
    .file-link {
      color: #409eff;
      text-decoration: none;
      &:hover {
        text-decoration: underline;
      }
    }
  }

  .no-file {
    color: rgba(0, 0, 0, 0.65);
  }
</style>

