<template>
  <div>
    <div class="basic-info-title">
      <img src="@/assets/enterpriseLibrary/basic-info.png" alt="财务报告">
      <span>财务报告</span>
    </div>

    <el-form
      :model="formData"
      :rules="rules"
      ref="financeReportForm"
      label-width="110px"
      label-position="top"
    >
      <!-- 财务报告上传 -->
      <el-form-item label="财务报告附件" prop="fileList">
        <UploadFile
          :fileList="formData.fileList"
          :fileUploadRule="financeReportUploadRule"
          @file-change="(files, type) => handleFileChange(files, type)"
          @del-file="handleDelFile"
          :uploadType="uploadType"
          :maxFileTips="maxFileTips"
          type="finance_report"
        />
      </el-form-item>

      <!-- 文件名 -->
      <el-form-item label="文件名" prop="fileName">
        <el-input
          v-model="formData.fileName"
          placeholder="文件上传后自动提取"
          class="form-control"
          maxlength="100"
          readonly
        ></el-input>
      </el-form-item>

      <!-- 报告年份 -->
      <el-form-item label="报告年份" prop="reportYear">
        <el-input
          v-model="formData.reportYear"
          placeholder="自动提取"
          class="form-control"
          maxlength="4"
        ></el-input>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
import UploadFile from '@/views/common/UploadFile.vue'

export default {
  name: 'FinanceReportUpload',
  components: { UploadFile },
  dicts: ['identification_tag'],
  data() {
    return {
      uploadType: 'pdf,doc,docx',
      maxFileTips: '100MB',
      ocrRuleList: ['finance_report'], // 恢复OCR配置（仅用于年份识别）
      fileUploadList: [],
      ocrResultParams: {
        "报告年份": "reportYear"
      },
      formData: {
        fileList: [],
        fileName: '',
        reportYear: '',
        delFileList: []
      },
      rules: {
        fileList: [
          { required: true, message: '请上传财务报告附件', trigger: 'change' }
        ],
        fileName: [
          { required: true, message: '文件名需等待文件上传后自动提取', trigger: 'blur' }
        ],
        reportYear: [
          { required: true, message: '请输入报告年份', trigger: 'blur' },
          { pattern: /^\d{4}$/, message: '请输入有效的年份（4位数字）', trigger: 'blur' }
        ]
      }
    }
  },
  computed: {
    financeReportUploadRule() {
      return this.fileUploadList[0]
    }
  },
  watch: {
    'dict.type.identification_tag': {
      handler(newVal) {
        if (newVal && newVal.length > 0) {
          this.addOcrRule()
        }
      },
      immediate: true
    }
  },
  methods: {
    // 接收父组件数据并回显
    setFormData(data) {
      const reportFiles = Array.isArray(data.fileList)
        ? data.fileList.filter(file => file && file.businessType === 'finance_report')
        : []

      this.formData = {
        ...data,
        fileList: reportFiles,
        fileName: reportFiles.length > 0 ? reportFiles[0].name : '', // 文件名取自文件
        delFileList: []
      }
    },

    // 处理文件变更：文件名直接提取，年份触发OCR识别
    handleFileChange(files, type) {
      if (type === 'finance_report') {
        const markedFiles = files.map(file => ({
          ...file,
          businessType: 'finance_report'
        }))
        this.formData.fileList = markedFiles

        // 1. 提取文件名（直接取自文件）
        if (markedFiles.length > 0) {
          const originalFileName = markedFiles[0].name
          const safeFileName = originalFileName.replace(/--+/g, '-') // 过滤非法字符
          this.formData.fileName = safeFileName
          this.$refs.financeReportForm.validateField('fileName')
          this.$message.success(`文件名已自动提取：${safeFileName}`)
        }

        // 2. 触发OCR识别（仅用于提取年份）
        this.handleOcrResult(markedFiles)
      }
    },

    // 处理OCR识别结果（只提取年份）
    handleOcrResult(files) {
      if (!files || !Array.isArray(files) || files.length === 0) return

      this.$bus.$emit('startUpload', '正在识别报告年份') // 修改动画文本为“识别年份”

      try {
        const firstFile = files[0]
        if (firstFile.response?.ocrResult) {
          const ocrResult = firstFile.response.ocrResult
          if (ocrResult.status_code === 200) {
            const chat_res = ocrResult.data?.chat_res
            if (chat_res && typeof chat_res === 'object') {
              // 只处理年份字段
              Object.keys(chat_res).forEach(key => {
                const formField = this.ocrResultParams[key]
                if (formField === 'reportYear' && chat_res[key]) {
                  // 清洗年份数据（只保留数字，确保4位）
                  const year = chat_res[key].replace(/[^\d]/g, '')
                  this.formData[formField] = year.length === 4 ? year : ''
                }
              })
              // 识别成功提示（只提示年份）
              this.$message.success('OCR识别成功，已自动填充报告年份')
              this.$refs.financeReportForm.validateField('reportYear')
            }
          } else {
            this.$message.error(`年份识别失败: ${ocrResult.status_msg || '未知错误'}`)
          }
        }
      } catch (error) {
        this.$message.error(`处理年份结果失败: ${error.message}`)
      } finally {
        this.$bus.$emit('endUpload')
      }
    },

    // 处理文件删除
    handleDelFile(file) {
      const filePath = file.response?.fileRes?.uploadPath || file.filePath
      if (filePath && !this.formData.delFileList.includes(filePath)) {
        this.formData.delFileList.push(filePath)
      }
      // 删除文件后清空文件名和年份
      if (this.formData.fileList.length === 0) {
        this.formData.fileName = ''
        this.formData.reportYear = ''
      }
    },

    // 表单验证
    validate() {
      return new Promise((resolve, reject) => {
        if (!this.$refs.financeReportForm) {
          reject(new Error('表单实例未加载完成'))
          return
        }

        this.$refs.financeReportForm.validate((valid) => {
          if (valid) {
            resolve(this.formData)
          } else {
            reject(new Error('财务报告信息填写不完整'))
          }
        })
      })
    },

    // 重置表单
    resetForm() {
      if (this.$refs.financeReportForm) {
        this.$refs.financeReportForm.resetFields()
      }
      this.formData = {
        fileList: [],
        fileName: '',
        reportYear: '',
        delFileList: []
      }
    },

    // 初始化OCR识别规则（用于年份识别）
    addOcrRule() {
      this.ocrRuleList.forEach(item => {
        this.ocrRule(item)
      })
    },

    // 获取OCR识别规则（用于年份识别）
    ocrRule(type) {
      const foundItem = this.dict.type.identification_tag?.find(item => item.value === type)
      if (!foundItem) {
        this.$message.warning(`未找到${type}的识别规则配置`)
        return
      }

      const item = {
        fileUploadType: foundItem.value,
        fields_json: foundItem.raw?.remark,
        suffix: 'mainDatabase'
      }

      this.fileUploadList.push(item)
    }
  }
}
</script>

<style scoped lang="scss">
/* 样式保持不变 */
.basic-info-title {
  display: flex;
  align-items: center;
  margin: 10px 0;
  span {
    margin: 0 5px;
    font-size: 20px;
  }
  img {
    width: 24px;
    height: 24px;
    object-fit: contain;
  }
}

.el-form {
  margin-top: 15px;
  padding: 0 15px;
}

.form-control {
  width: 100%;
}

.el-form-item {
  margin-bottom: 20px;
}

.upload-tip {
  color: #909399;
  font-size: 12px;
  margin-top: 5px;
  line-height: 1.5;
}

::v-deep .el-form-item__label {
  color: #4e5969;
  font-weight: 500;
}

::v-deep .el-input.is-readonly .el-input__inner {
  background-color: #f5f7fa;
  cursor: default;
}
</style>
