<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.attachmentUrl"
            :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.attachmentUrl" :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>
        <!-- <UploadFiles
          label="上传文件"
          :maxCount="1"
          :file-list="ruleFormData.attachmentUrl"
          :disabled="isViewMode"
          :allow-all-file-types="true"
          @upload-success="handleUploadSuccess"
        /> -->
      </template>
      <template #content>
        <div class="editor-container">
          <Toolbar style="border-bottom: 1px solid #dcdfe6" :editor="editorRef" />
          <Editor
            style="height: 400px; overflow-y: auto"
            v-model="ruleFormData.description"
            mode="default"
            :defaultConfig="editorConfig"
            @on-created="handleEditorCreated"
            @on-change="handleEditorChange"
          />
        </div>
      </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 { ACADEMY_FILE_FORM_CONFIG, ACADEMY_FILE_FORM_DATA, ACADEMY_FILE_FORM_RULES } from '../configs/form';
  import {
    querySafetyPublicityBoardDetail,
    saveSafetyPublicityBoardPage,
    updateSafetyPublicityBoardPage,
  } from '@/api/safety-culture';
  import type { FileItem } from '@/components/UploadFiles/types';
  import { formatAttachmentList } from '@/components/UploadFiles/utils';
  import PreviewOnline from '@/views/disaster/components/PreviewOnline.vue';

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

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

  const isCreateMode = computed(() => operate.value === 'safety-publicity-board-create');
  const isEditMode = computed(() => operate.value === 'safety-publicity-board-edit');
  const isViewMode = computed(() => operate.value === 'safety-publicity-board-view');
  const previewOnlineRef = ref<InstanceType<typeof PreviewOnline>>();

  const { ruleFormData, formRules, ruleFormConfig, cloneRuleFormData } = useFormConfigHook(
    ACADEMY_FILE_FORM_CONFIG,
    ACADEMY_FILE_FORM_DATA,
    ACADEMY_FILE_FORM_RULES,
  );

  // 查看模式下，所有字段设为只读
  const viewFormConfig = ref(
    ACADEMY_FILE_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;
    if (isViewMode.value) {
      editor.disable();
    }
  };

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

  // 文件上传
  const handleUploadSuccess = (files: FileItem[]) => {
    ruleFormData.attachmentUrl = files;
  };

  const parseAttachmentUrls = (attachmentUrl?: string): string[] => {
    if (!attachmentUrl || !attachmentUrl.trim()) {
      return [];
    }

    const normalized = attachmentUrl.trim();

    if (normalized.startsWith('[') && normalized.endsWith(']')) {
      try {
        const parsed = JSON.parse(normalized);
        if (Array.isArray(parsed)) {
          return parsed.map((item) => String(item).trim()).filter((item) => item);
        }
      } catch (error) {
        console.error('解析 attachmentUrl 失败:', error);
      }
    }

    return normalized
      .split(',')
      .map((url) => url.trim())
      .filter((url) => url);
  };

  // 将逗号分隔的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 querySafetyPublicityBoardDetail(currentId.value);
      if (res) {
        ruleFormData.materialName = res.materialName || '';
        ruleFormData.categoryName = res.categoryName || '';
        ruleFormData.description = res.description || '';
        ruleFormData.attachmentUrl = JSON.parse(res.attachmentUrl || res.fileUrl || '');
        ruleFormData.status = res.status ?? 1;
      }
      cloneRuleFormData();
    } catch (e) {
      console.error('获取院级文件详情失败:', e);
      ElMessage.error('获取详情失败');
    }
  };

  const handleSubmit = async () => {
    const res = await handleValidate();
    if (!res) return;

    // 验证文件上传（必填）
    if (!ruleFormData.attachmentUrl || ruleFormData.attachmentUrl.length === 0) {
      ElMessage.warning('请上传文件');
      return;
    }
    try {
      const uploadedFileList = await formatAttachmentList(ruleFormData.attachmentUrl);
      const basePayload = {
        materialName: ruleFormData.materialName,
        categoryName: ruleFormData.categoryName,
        description: ruleFormData.description,
        attachmentUrl: JSON.stringify(uploadedFileList),
      };
      if (isCreateMode.value) {
        await saveSafetyPublicityBoardPage(basePayload);
        ElMessage.success('创建成功');
      } else if (isEditMode.value && currentId.value) {
        await updateSafetyPublicityBoardPage({
          id: currentId.value,
          ...basePayload,
        });
        ElMessage.success('保存成功');
      }

      router.back();
    } catch (e) {
      console.error('保存院级文件失败:', e);
      ElMessage.error('保存失败，请重试');
    }
  };
  const previewOnline = (url: string | undefined, type) => {
  if (url) {
    previewOnlineRef.value?.open(url, type);
  }
};

  // const handleImageUploadSuccess = (response: any, file: any, fileList: any[]) => {
  //   const imageUrl = response.data?.url || file.url;
  //   ruleFormData.imageFileUrl = fileList.map((item) => ({
  //     fileId: Date.now() + Math.random(),
  //     fileName: item.name,
  //     fileType: 'image',
  //     fileSize: (item.size / 1024).toFixed(2) + 'KB',
  //     fileUrl: imageUrl || item.url,
  //   }));
  // };

  // const handleImageRemove = (file: any, fileList: any[]) => {
  //   ruleFormData.imageFileUrl = fileList.map((item) => ({
  //     fileId: item.fileId || Date.now() + Math.random(),
  //     fileName: item.name || item.fileName,
  //     fileType: 'image',
  //     fileSize: item.size ? (item.size / 1024).toFixed(2) + 'KB' : item.fileSize,
  //     fileUrl: item.url || item.fileUrl,
  //   }));
  // };

  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);
  }

  .image-uploader {
    :deep(.el-upload--picture-card) {
      width: 80px !important;
      height: 80px !important;
      line-height: 80px;
    }

    :deep(.el-upload-list--picture-card .el-upload-list__item) {
      width: 80px !important;
      height: 80px !important;
    }
  }
</style>

<style lang="scss">
.w-e-full-screen-container {
  inset: 0 !important;
  z-index: 3000 !important;
}

.w-e-full-screen-container .w-e-text-container {
  height: calc(100vh - 42px) !important;
}
</style>
