<template>
  <div class="apply-block">
    <baseTitle :title="getTitleName(title)+'信息'"></baseTitle>
    <el-form :model="localFormData" ref="formRef" label-width="auto" v-if="step!=='50'">
      <el-row>
        <el-col :span="6" v-if="title==='apply'">
          <!--          label-width="106"-->
          <el-form-item label="项目负责人" :required="true" prop="" label-width="111">
            <el-button style="margin-right: 10px" color="#DED0B2" @click="handleShowProjectChargePersonTable">
              {{ projectChargePersonUserList?.length !== 0 ? '更改' : '请选择' }}
            </el-button>
            <div v-for="item in projectChargePersonUserList" :key="item.id" style="margin-right: 5px">
              {{ item.name }}
            </div>
            <user-picker :multiple="false" ref="projectChargePersonUserPicker" title="请选择项目负责人"
                         v-model:value="projectChargePersonUserList" @ok="projectChargePersonUserPickerOk"  @cancelOrClear="projectChargePersonUserPickerCancel"/>
          </el-form-item>
        </el-col>
        <el-col :span="6" v-if="title==='apply'">
          <el-form-item label="项目成员" :required="true" prop="" label-width="85"
          >
            <el-button color="#DED0B2" style="margin-right: 10px" @click="handleShowProjectPersonTable">
              {{ projectPersonUserList?.length !== 0 ? '更改' : getProjectPerson(projectPersonUserList) ? '更改' : '请选择' }}
            </el-button>
            <div v-for="(item,index) in getProjectPerson(projectPersonUserList)" :key="item.id" >
              {{ item.name }}{{index != getProjectPerson(projectPersonUserList)?.length - 1 ? '，' : ''}}
            </div>
            <user-picker :multiple="true" ref="projectPersonUserPicker" title="请选择项目成员"
                         v-model:value="projectPersonUserList" @ok="projectPersonUserPickerOk"  @cancelOrClear="projectPersonUserPickerCancel"/>
          </el-form-item>
        </el-col>
        <el-col :span="6" v-if="title==='apply'||title==='check'">
          <el-form-item label="部门分管领导" :label-width="title==='check'?110:115">
            <el-button color="#DED0B2" style="margin-right: 10px" @click="handleShowOptionalChargeLeadershipPicker">
              {{
                optionalChargeLeadershipList?.length !== 0 ? '更改' : getOptionalChargeLeadershipList(optionalChargeLeadershipList) ? '更改' : '请选择'
              }}
            </el-button>
            <div v-for="(item,index) in getOptionalChargeLeadershipList(optionalChargeLeadershipList)" :key="item.id">
              {{ item.name }}{{index != getOptionalChargeLeadershipList(optionalChargeLeadershipList)?.length - 1 ? '，' : ''}}
            </div>
            <user-picker :multiple="true" ref="optionalChargeLeadershipPickerRef" title="请选择部门分管领导"
                         v-model:value="optionalChargeLeadershipList" @ok="optionalChargeLeaderPickerOk" @cancelOrClear="optionalChargeLeaderPickerCancel"/>
          </el-form-item>
        </el-col>
        <el-col :span="24" v-if="preProcessShow === 'EDIT'">
          <el-form-item label="前置流程" :required="preProcessRequired" prop="preProcess" label-width="125">
            <el-button color="#DED0B2" @click="handleShowPreTable" style="margin-right: 10px">
              {{
                localFormData.preProcess && localFormData.preProcess?.length > 0 ? '更改' : sessionParams.preProcess && sessionParams.preProcess?.length > 0 ? '更改' : '请选择'
              }}
            </el-button>
            <div v-for="(item,index) in getRequestName(localFormData.preProcess)" :key="item.requestId">
              <a :href="item.baseUrl" target="_blank"
                 style="color: #2a99ff;cursor: pointer">{{ item.requestName }}<span
                  v-if="index != localFormData.preProcess?.length -1">，</span>
              </a>
            </div>
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <!--    v-if="showAttachment"-->
    <AttachmentUpload ref="attachment" :label="getTitleName(title)+'附件'" :showTable="showTable"
                      v-model:otherFileList="otherFileList" :tag="getTitleName(props.title)"  :templateName="getTemplateName(props.title)" :templateDownloadBtnShow="props.title==='apply'?true:props.title==='check'"
                      @getAttachment="getAttachment" v-model:singleList="singleList" :showSingleTable="showSingleTable"
                      @getOtherFile="getOtherFile" :showFileList="true" :formData="localFormData"
                      :preview="mode == 'resubmit'"/>
    <div>
      <div class="approval-record">
        <div class="approval-title" style="margin-top: -15px">
          <!--          <baseTitle title="审批记录" v-if="mode === 'resubmit'"></baseTitle>-->
          <!--          <div v-else></div>-->
          <baseTitle title="审批记录"></baseTitle>
          <div class="diagram">
            <div class="base-title">流程图</div>
            <el-switch
                v-model="changeDiagram"
                style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
            />
          </div>
        </div>
        <el-empty :image-size="100" description="暂无审批记录" v-if="!data?.operationList&&!changeDiagram"/>
        <div class="process">
          <operation-render
              v-if="mode === 'resubmit'&&processDiagramViewer&& data?.operationList && data?.operationList.length > 0&&!changeDiagram"
              :operation-list="data.operationList"
              :state="data.state"/>
          <process-diagram-viewer mode="view" :idName="title" v-if="processDiagramViewer&&changeDiagram"/>
        </div>
      </div>
    </div>
    <div class="oper-page-btn">
      <el-button color="#DED0B2" v-if="mode === 'submit'" @click="handleSubmit">提交</el-button>
      <el-button color="#DED0B2" v-else-if="mode === 'resubmit'" @click="handleSubmit">重新提交</el-button>
      <el-button @click="handleBack">返回</el-button>
    </div>

    <file-preview ref="filePreviewRef" v-if="filePreviewShow" :fileName="filePreviewParam.fileName"
                  :fileUrl="filePreviewParam.fileUrl"
                  :fileType="filePreviewParam.fileType"/>
    <el-dialog v-if="showPreTable" title="前置流程" v-model="showPreTable" width="80%">
      <el-form :model="preProcessForm" inline @submit.prevent="searchPreProcess">
        <el-form-item label="请求名称">
          <el-input v-model="preProcessForm.requestName" placeholder="请输入请求名称" clearable>
          </el-input>
        </el-form-item>
        <el-form-item>
          <el-button color="#DED0B2" @click="searchPreProcess">搜索</el-button>
          <el-button @click="handleReset">重置</el-button>
        </el-form-item>
      </el-form>
      <el-table :data="preProcessList" v-loading="loading"
                @select="handleSelect" @select-all="handleSelect" row-key="requestId" ref="preProcessTable">
        <el-table-column type="selection" width="55" :reserve-selection="true"/>
        <el-table-column prop="requestId" label="请求id"></el-table-column>
        <el-table-column prop="requestName" label="请求名称"></el-table-column>
        <el-table-column prop="lastOperatorName" label="最后操作人名称"></el-table-column>
        <el-table-column prop="lastOperateTime" label="最后操作时间"></el-table-column>
        <el-table-column prop="currentNodeName" label="当前节点"></el-table-column>
        <el-table-column prop="creatorName" label="创建人"></el-table-column>
        <el-table-column prop="createTime" label="创建时间"></el-table-column>
        <el-table-column label="操作" align="center">
          <template #default="scope">
            <!--              <el-button type="primary" @click="choosePreProcess(scope.row)" link>选择</el-button>-->
            <a :href="scope.row.baseUrl" target="_blank" style="color: #2a99ff;margin-left: 10px">查看流程</a>
          </template>
        </el-table-column>
      </el-table>
      <paging :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :page-sizes="[10, 20, 30, 40,50]"
              :total="total" @changeSize="handleSizeChange" @goPage="handleCurrentChange"/>
      <div class="oper">
        <el-button color="#DED0B2" @click="choosePreProcess">确定</el-button>
        <el-button @click="handleCancel">取消</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script setup lang="jsx">
import OperationRender from '@/views/workflow/common/OperationRender.vue'
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
import {ElNotification} from "element-plus";
import {
  getApplyProcess,
  getPreProcess,
  getProjectCheckProcess,
  getProjectConclusionProcess,
  projectApply,
  projectCheck,
  projectConclusion,
  resubmitApply,
  resubmitCheck,
  resubmitConclusion
} from "@/api/project-manage";
import {useProcessStore} from '@/stores/processStore.js';
import {useTagsView} from '@/stores/tagsview.js'
import Paging from "@/components/pagination/index.vue";
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";

const router = useRouter()
const route = useRoute()
const changeDiagram = ref(false)
const showSingleTable = ref(false)
const projectChargePersonUserList = ref([])
const projectChargePersonUserPicker = ref()
const projectPersonUserList = ref([])
const projectPersonUserPicker = ref()
const singleList = ref([])

const emit = defineEmits(["getAttachment", "getOtherFile"])
const props = defineProps({
  title: {
    type: String,
    default: 'apply'
  },
  showTable: {
    type: Boolean,
    default: false
  },
  mode: {
    type: String,
    default: "view"
  },
  data: {
    type: Object,
    default: {}
  },
  formData: {
    type: Object,
    default: {}
  },
  step: {
    type: String,
    default: "20"
  },
  preProcessShow: {
    type: String,
    default: "READ"
  }
})
const preProcessList = ref([])
//暂存数据
const currentList = ref([])
const preProcessRequired = ref(false)
const total = ref(0)
const preProcessForm = reactive({
  requestName: ''
})
const pageInfo = reactive({
  pageNum: 1,
  pageSize: 10,
})
// const rules = reactive({
//   preProcess: [{required: true, message: '请选择前置流程', trigger: 'blur'}],
//   projectChargePerson: [{required: true, message: '请选择项目负责人', trigger: 'blur'}],
//   projectPerson: [{required: true, message: '请选择项目成员', trigger: 'blur'}],
// })
const tagsViewStore = useTagsView()
const processStore = useProcessStore()
const localProjectPerson = ref([])
const otherFileList = ref([])
const localFormData = ref({
  projectPersonIds: [],
  projectChargePerson: null,
  preProcess: [
    // {
    //   requestId: null,
    //   requestName: '',
    //   baseUrl: ''
    // }
  ]
})
const attachment = ref()
const deploymentData = ref({})
const showPreTable = ref(false)
const showTable = ref(true)
const loading = ref(false)
const processDiagramViewer = ref(false)
const name = ref(router.currentRoute.value.name)
const deploymentId = ref()
const selectRows = ref([])
const projectId = ref(route.query.projectId)
const sessionParams = ref({})
const optionalChargeLeadershipPickerRef = ref()
const optionalChargeLeadershipList = ref([])
const filePreviewParam = ref({
  fileUrl: '',
  fileName: '',
  fileType: 'pdf'
})
const filePreviewShow = ref(false)

const getTemplateName=(type)=>{
  switch (type) {
    case 'apply':
      return '科技创新项目立项模板'
    case 'check':
      return '科技创新项目验收申请表'
  }
}

const handleShowOptionalChargeLeadershipPicker = () => {
  optionalChargeLeadershipPickerRef.value.showUserPicker()
}

const optionalChargeLeaderPickerOk = (userList) => {
  optionalChargeLeadershipList.value = userList
  if(userList?.length>0){
    localStorage.setItem('optionalChargeLeadershipList', JSON.stringify(optionalChargeLeadershipList.value))
  }else {
    localStorage.removeItem('optionalChargeLeadershipList')
  }
}
const optionalChargeLeaderPickerCancel = (userList) => {
  optionalChargeLeadershipList.value = userList
}

const clickToPreview = (row) => {
  filePreviewShow.value = false
  filePreviewParam.value = {
    fileUrl: row.url,
    fileName: row.originalFileName,
    fileType: row.fileType
  }
  nextTick(() => {
    filePreviewShow.value = true
  })
}

const getOptionalChargeLeadershipList = (list) => {
  if (!list || list && list.length === 0) {
    if (localStorage.getItem('optionalChargeLeadershipList')) {
      let param = JSON.parse(localStorage.getItem('optionalChargeLeadershipList'))
      optionalChargeLeadershipList.value = param
      return optionalChargeLeadershipList.value
    }
  } else {
    return list
  }
}
const getProjectPerson = (list) => {
  if (!list || list && list.length === 0) {
    if (localStorage.getItem('projectPersonUserList')) {
      let param = JSON.parse(localStorage.getItem('projectPersonUserList'))
      projectPersonUserList.value = param
      return projectPersonUserList.value
    }
  } else {
    return list
  }
}
const getRequestName = (list) => {
  if (!list || (list && list.length === 0)) {
    if (sessionParams.value.preProcess) {
      return sessionParams.value.preProcess
    }
  } else {
    return list
  }
}
const getProjectChargePersonUser = () => {
  if (projectChargePersonUserList.value.length !== 0) {
    return projectChargePersonUserList.value.map(item => item.name).join()
  }
}
const handleSelect = async (selection) => {
  selectRows.value = selection
}
const handleCancel = () => {
  showPreTable.value = false
}
const searchPreProcess = () => {
  getPreProcessList()

}
const handleReset = () => {
  preProcessForm.requestName = ''
  getPreProcessList()
}
const handleShowPreTable = () => {
  showPreTable.value = true
  getPreProcessList()
}
const handleShowProjectChargePersonTable = () => {
  projectChargePersonUserPicker.value.showUserPicker()
}
const projectChargePersonUserPickerOk = (userList) => {
  projectChargePersonUserList.value = userList
  if(userList?.length>0){
    localStorage.setItem('projectChargePersonUserList', JSON.stringify(projectChargePersonUserList.value))
  }else {
    localStorage.removeItem('projectPersonUserList')
  }
}
const handleShowProjectPersonTable = () => {
  projectPersonUserPicker.value.showUserPicker()
}
const projectChargePersonUserPickerCancel=(userList)=>{
  projectChargePersonUserList.value = userList
}
const projectPersonUserPickerCancel=(userList)=>{
  projectPersonUserList.value = userList
}

const projectPersonUserPickerOk = (userList) => {
  projectPersonUserList.value = userList
  if(userList?.length>0){
    localStorage.setItem('projectPersonUserList', JSON.stringify(userList))
  }else {
    localStorage.removeItem('projectPersonUserList')
  }
}
const getPreProcessList = () => {
  loading.value = true
  getPreProcess().then(res => {
    loading.value = false
    let searchArray = []
    let regexPattern = ("%" + preProcessForm.requestName + "%").replace(/%/g, '.*').replace(/_/g, '.');
    let regex = new RegExp('^' + regexPattern + '$');
    res.data.filter((item) => {
      if (regex.test(item.requestName)) {
        searchArray.push(item)
      }
    })
    // res.data.forEach((item) => {
    //   localFormData.value.preProcess.forEach((item1) => {
    //     if (item.requestId == item1.requestId) {
    //       preProcessTable.value.toggleRowSelection(item)
    //     }
    //   })
    // })
    total.value = searchArray.length
    currentList.value = searchArray
    preProcessList.value = currentList.value.slice(0, 10)
  })
}
const choosePreProcess = () => {
  let preProcessObj = {}
  let preProcessArray = []
  selectRows.value.forEach((item) => {
    preProcessObj = {
      requestId: item.requestId,
      requestName: item.requestName,
      baseUrl: item.baseUrl
    }
    preProcessArray.push(preProcessObj)
  })
  localFormData.value.preProcess = preProcessArray
  showPreTable.value = false
  localStorage.setItem('preProcess', JSON.stringify(preProcessArray))
}

//切换每页显示条数
const handleSizeChange = (val) => {
  pageInfo.pageSize = val;
  preProcessList.value = currentList.value.slice((pageInfo.pageNum - 1) * val, pageInfo.pageNum * val)
};

//点击页码进行分页功能
const handleCurrentChange = (val) => {
  pageInfo.pageNum = val;
  preProcessList.value = currentList.value.slice((val - 1) * pageInfo.pageSize, val * pageInfo.pageSize)
};
const getTitleName = (type) => {
  switch (type) {
    case 'apply':
      return '项目立项'
    case 'check':
      return '项目验收'
    case 'filing':
      return '项目归档'
  }
}
const handleBack = () => {
  history.back()
}
const compositeParam = (item) => {
  return {
    fileId: item.id,
    size: item.size,
    originalFileName: item.originalFilename,
    fileType: item.fileType,
    url: item.url,
    newFile: true,
    tag: getTitleName(props.title)
  }
}
const getAttachment = (val) => {
  // console.log('上传文件getAttachment', val)
  showSingleTable.value = false
  localFormData.value.singleFile = compositeParam(val)
  singleList.value.push(compositeParam(val))
  nextTick(() => {
    showSingleTable.value = true
    if (attachment.value.singleFile == null) {
      attachment.value.validate()
      ElNotification({
        title: '提示',
        message: '请上传附件',
        type: 'error'
      })
      return;
    } else {
      attachment.value.clearValidate()
    }
  })

  localStorage.setItem('singleFile', JSON.stringify(compositeParam(val)))
}
watch(() => singleList.value, (newVal) => {
  showSingleTable.value = newVal.length !== 0;
}, {deep: true})
const getOtherFile = (val) => {
  // console.log('上传文件getOtherFile', val)
  showTable.value = false
  let fileObj = compositeParam(val)
  otherFileList.value.push(fileObj)
  nextTick(() => {
    showTable.value = true
  })

  // localFormData.value.otherFileList = otherFileList.value
  localStorage.setItem('otherFileList', JSON.stringify(otherFileList.value))
}
const getFileParam = (item) => {
  return {
    fileId: item.fileId,
    tag: item.tag
  }
}
const handleSubmit = async () => {
  let files = []
  if (props.mode === 'resubmit') {
    attachment.value.allFileList.forEach(item => {
      files.push(getFileParam(item))
    })
  } else {
    otherFileList.value.forEach(item => {
      files.push(getFileParam(item))
    })
  }
  // console.info("🚀 ~method:handleSubmit -----", files,attachment.value.isHaveOneFile)
  if (!attachment.value.isHaveOneFile) {
    attachment.value.validate()
    ElNotification({
      title: '提示',
      message: '请上传附件',
      type: 'error'
    })
    return;
  } else {
    attachment.value.clearValidate()
  }
  let projectPersonIds = []
  for (const item of projectPersonUserList.value) {
    projectPersonIds.push(parseInt(item.id))
  }
  let params = {
    deploymentId: deploymentId.value,
    requirementId: route.query.id,
    fileList: files,
    // singleFile: attachment.value.singleFile,
    projectId: projectId.value,
    preProcess: JSON.stringify(localFormData.value.preProcess)
  }
  if (sessionParams.value.preProcess && !localFormData.value.preProcess) {
    params.preProcess = JSON.stringify(sessionParams.value.preProcess)
  }
  // console.log(params.preProcess)
  let res
  if (props.step === '20') {
    if (projectChargePersonUserList.value && projectChargePersonUserList.value.length === 0) {
      ElNotification({
        title: '提示',
        message: '请选择项目负责人!',
        type: 'error'
      })
      return;
    }
    if (projectPersonUserList.value && projectPersonUserList.value.length === 0) {
      ElNotification({
        title: '提示',
        message: '请选择项目成员!',
        type: 'error'
      })
      return;
    }
    params.projectChargePerson = parseInt(projectChargePersonUserList.value[0].id)
    params.projectPersonIds = projectPersonIds
    params.optionalChargeLeadership = optionalChargeLeadershipList.value
    if (props.mode === 'resubmit') {
      res = await resubmitApply(params)
    } else {
      res = await projectApply(params)
    }
  } else if (props.step === '40') {
    params.optionalChargeLeadership = optionalChargeLeadershipList.value
    if (props.mode === 'resubmit') {
      res = await resubmitCheck(params)
    } else {
      res = await projectCheck(params)
    }
  } else if (props.step === '50') {
    if (props.mode === 'resubmit') {
      res = await resubmitConclusion(params)
    } else {
      res = await projectConclusion(params)
    }
  }
  ElNotification({
    title: '提示',
    message: res.msg,
    type: res.code === 1000 ? 'success' : 'error'
  })
  if (res.code === 1000) {
    tagsViewStore.delVisitedViews(router.currentRoute.value.path)
    if (props.step === '20') {
      await router.push({
        name: 'Initiation'
      })
    } else if (props.step === '40') {
      await router.push({
        name: 'Implementation'
      })
    } else if (props.step === '50') {
      await router.push({
        name: 'Filing'
      })
    }
  }
}
const init = async () => {
  let id = projectId.value
  if (!id) return;
  processDiagramViewer.value = false
  let res
  if (props.step === '20') {
    res = await getApplyProcess(id)
  } else if (props.step === '40') {
    res = await getProjectCheckProcess(id)
  } else if (props.step === '50') {
    res = await getProjectConclusionProcess(id)
  }
  if (res.code === 1000) {
    let data = res.data
    deploymentId.value = data.deploymentId
    deploymentData.value = data
    preProcessRequired.value = data.deploymentName === '重大项目立项' || data.deploymentName === '重大项目验收';
    processStore.setDesign(data)
    processStore.runningList.value = data.runningList;
    processStore.endList.value = data.endList;
    processStore.noTakeList.value = data.noTakeList;
    processStore.refuseList.value = data.refuseList;
    processStore.passList.value = data.passList;
    nextTick(() => {
      processDiagramViewer.value = true
    })
  } else {
    ElNotification({
      title: '提示',
      message: res.msg,
      type: 'error'
    })
  }
}

watchEffect(() => {
  // console.info("🚀 ~method:;props.formData.projectChargePerson -----", props.formData.projectChargePerson)
  if (props.formData.projectChargePerson == null) {
    projectChargePersonUserList.value = []
  } else {
    projectChargePersonUserList.value = [props.formData.projectChargePerson]
  }
  if (props.formData.optionalChargeLeadership == null) {
    optionalChargeLeadershipList.value = []
  } else {
    optionalChargeLeadershipList.value = props.formData.optionalChargeLeadership
  }
  projectPersonUserList.value = props.formData.projectPersonList ? props.formData.projectPersonList : []
  let flag = Object.keys(props.formData).length && (localFormData.value = props.formData)
  // if (props.formData.projectChargePerson != null) {
  //   localFormData.value.projectChargePerson = props.formData.projectChargePerson.id
  // }

  if (localStorage.getItem('preProcess')) {
    let param = JSON.parse(localStorage.getItem('preProcess'))
    localFormData.value.preProcess = param
    sessionParams.value.preProcess = param
    localStorage.setItem('preProcess', JSON.stringify(param))
  }
  if (localStorage.getItem('singleFile')) {
    let param = JSON.parse(localStorage.getItem('singleFile'))
    localFormData.value.singleFile = param
    singleList.value = [param]
    localStorage.setItem('singleFile', JSON.stringify(param))
    showSingleTable.value = false
    nextTick(() => {
      showSingleTable.value = true
    })
  }
  if (localStorage.getItem('otherFileList')) {
    let param = JSON.parse(localStorage.getItem('otherFileList'))
    localFormData.value.otherFileList = param
    otherFileList.value = param
    localStorage.setItem('otherFileList', JSON.stringify(param))
    showTable.value = false
    nextTick(() => {
      showTable.value = true
    })
  }

  if (localStorage.getItem('projectChargePersonUserList')) {
    let param = JSON.parse(localStorage.getItem('projectChargePersonUserList'))
    projectChargePersonUserList.value = param
    localStorage.setItem('projectChargePersonUserList', JSON.stringify(param))
  }
  if (localStorage.getItem('projectPersonUserList')) {
    let param = JSON.parse(localStorage.getItem('projectPersonUserList'))
    projectPersonUserList.value = param
    localProjectPerson.value = param
    localStorage.setItem('projectPersonUserList', JSON.stringify(param))
  }
  if (localStorage.getItem('optionalChargeLeadershipList')) {
    let param = JSON.parse(localStorage.getItem('optionalChargeLeadershipList'))
    optionalChargeLeadershipList.value = param
    // localProjectPerson.value = param
    localStorage.setItem('optionalChargeLeadershipList', JSON.stringify(param))
  }

  return flag
})
onActivated(() => {
  init()
})
onMounted(async () => {
  await init()
})
</script>

<style scoped lang="scss">
.oper {
  margin-top: 20px;
  display: flex;
  justify-content: flex-end;
}

</style>
