<template>
  <div class="bank-report-table" style="height:80vh;">
    <vxe-toolbar>
      <template #buttons>
        <div style="margin:10px">
          <span style="font-weight: bold"> 填报任务：{{ queryParam?.taskName }} </span>
          <span style="font-weight: bold;margin-left:20px"> 表格：{{ queryParam?.tplCode }} {{ queryParam?.tplName }}</span>
        </div>
      </template>
      <template #tools>
        <vxe-button status="primary" icon="vxe-icon-save" @click="saveBatch()">保存</vxe-button>
      </template>
    </vxe-toolbar>
    <vxe-table
      border
      ref="tableRef"
      show-header-overflow
      :data="tableFormData"
      :column-config="{ resizable: true }"
      :row-config="{ resizable: true }"
      class="custom-table"
      height="auto"
    >
      <vxe-column field="serialNumber" title="序号" width="80"></vxe-column>
      <vxe-column field="project" title="项目" width="200">
        <template #default="{ row }">
          <span style="font-weight: bold;size:20px">{{ row.project }}</span>
        </template>
      </vxe-column>
      <vxe-column field="content" title="内容" row-resize>
        <template #default="{ row }"> 
          <div class="content-cell">
            <template v-if="row.type === 'AttachTable'">
              <AttachTable
                :title="row.project"
                :records="row.datas"
                :fields="row.content"
                :pcode="row.code"
                :calcSum="row.calcSum"
                :showFooter="row.showFooter"
                :ref="(el) => setAttachTableRef(el, row.code)"
                style="margin:0px;padding:0px"
              />
            </template>
            <template v-else>
              <template v-for="(item, index) in row.content" :key="index">
                <span v-if="item.type === 'text'" v-html="item.value"></span>
                <span v-else-if="item.type === 'br'"><br></span>
                
                <template v-else-if="item.type === 'yesno'">
                  <vxe-radio-group v-model="formData[row.code +'_'+ item.field]">
                    <vxe-radio label="是" content="是">  
                    </vxe-radio>
                    <vxe-radio label="否" content="否"></vxe-radio>
                  </vxe-radio-group>
                </template>
                <vxe-input
                  v-else
                  :type="item.type"
                  v-model="formData[row.code +'_'+ item.field]"
                  size="mini"
                  class="table-input"
                >
                </vxe-input>
              </template>
            </template>
          </div>
        </template>
      </vxe-column>
      <vxe-column field="remarks" title="备注" width="200">
        <template #default="{ row }"> 
            <vxe-textarea :rows="row.remarks.rows" v-model="formData[row.code+'_'+row.remarks.field]">
            </vxe-textarea>
        </template>
      </vxe-column>
    </vxe-table>
  </div>
</template>

<script lang="ts" setup>
import AttachTable from '../tableComponents/AttachTable.vue'
import { tableFormData } from '../../data/tb11.data';
import { ref, reactive, onMounted } from 'vue'
import { VxeUI } from 'vxe-table'
import { batchSaveOrUpdateBeforeDelete, queryRecord } from '../../record/BaosongTaskRecord.api'
import { allTplItems } from '../../tpl/BaosongTplItem.api'
import { useRoute } from 'vue-router';

const route = useRoute();
const tableRef = ref();
const tplItemMap = ref({});
const queryParam = ref({
  taskId:-1,
  taskName:'',
  tplId:-1,
  tplName:'',
  tplCode:''
})

interface FormData {
  id: number | null
  taskid: number
  tplid: number
  itemid?: number
  itempid?: number
  content: string
  tplcode: string
  rind: number
}

onMounted(async ()=>{
  if (route.query.taskId) {  
    queryParam.value.taskId = Number(route.query.taskId); 
  }  
  if (route.query.taskName) {  
    queryParam.value.taskName = String(route.query.taskName);
  } 
  if (route.query.tplId) {  
    queryParam.value.tplId = Number(route.query.tplId);  
  }  
  if (route.query.tplName) {  
    queryParam.value.tplName = String(route.query.tplName); 
  } 
  if (route.query.tplCode) {  
    queryParam.value.tplCode = String(route.query.tplCode); 
  } 

  await setTplItemMap()
  await setData();
})

const loading = ref(false)
const formData = reactive({});
const formValues = ref<FormData[]>([])

const saveBatch = async () => {
  try {
    formValues.value = []

    for (const strKey in formData) {
      const valData = formData[strKey]
      if (valData) {
        let tmpAry = strKey.split("_")
        await setFormValues(tmpAry[0],tmpAry[1],valData,1)    
      }
    }

    await getAttachTableFormData();

    if (formValues.value.length > 0) {
      await batchSaveOrUpdateBeforeDelete(formValues.value)
      VxeUI.modal.message({ content: '保存成功', status: 'success' })
    } else {
      VxeUI.modal.message({ content: '没有需要保存的数据', status: 'warning' })
    }
  } catch (error) {
    VxeUI.modal.message({ content: `保存失败: ${error.message}`, status: 'error' })
  } finally {
    loading.value = false
  }
}

const childAttachTableRefs = ref({})
const setAttachTableRef = (el: any, index: string) => {
  if (el) {
    childAttachTableRefs.value[index] = el;
  }
};

const getAttachTableFormData = async () => {
  for (const pcode in childAttachTableRefs.value) {
      const child = childAttachTableRefs.value[pcode];
      if (child) {
          const datas = child.getFormData()
          for(const code in datas) {
            await setFormValues(pcode,code,datas[code],1)
          }
      }
  }
};

const setFormValues = async (pcode, code, valData, rind) => {
  if(!valData) return;
  let vals = Array.isArray(valData) ? valData.join(',') : valData 
  let strKey = pcode+"_"+code
  const item = tplItemMap.value[strKey];  
  const { pid, itemid } = item ?? {}; 
  
  let tempForm: FormData = {
    id: null,
    rind: rind,
    taskid: queryParam.value.taskId,
    tplid: queryParam.value.tplId,
    tplcode: code,
    itemid: itemid,
    itempid: pid,
    content: vals
  };
  formValues.value.push(tempForm)
}
  
async function setData() {
  try {
    loading.value = true
    const taskId = queryParam.value.taskId
    const tplid = queryParam.value.tplId
    Object.keys(formData).forEach(key => delete formData[key])
    await setTplItemMap();
    const recordData = await queryRecord({taskid: taskId, tplid: tplid})
    let valueObj = {}
    for(let data of recordData) {
      valueObj[data.itempid+"_" + data.itemid+"_"+ data.rind] = data["content"]
    }

    Object.keys(tplItemMap.value).forEach(strKey => {  
      const item = tplItemMap.value[strKey];  
      const { pid, itemid, formTp } = item ?? {}; 
      const dataVal = valueObj[pid+"_"+itemid+"_1"]
      if(formTp == 'checkbox') {
        formData[strKey] = dataVal?.split(",")
      } else {
        formData[strKey] = dataVal
      }
    });

    Object.keys(childAttachTableRefs.value).forEach(pcode => { 
      const child = childAttachTableRefs.value[pcode];
      const matchingKeys = Object.keys(tplItemMap.value).filter(key => key.startsWith(pcode + '_'));  
      const matchingObjects = matchingKeys.map(key => tplItemMap.value[key]);  
      let attachTableData = {}
      for(let tmpData of matchingObjects) {
        const { pid, itemid, formTp, code } = tmpData ?? {}; 
        if(formTp == 'checkbox') {
          attachTableData[code] = valueObj[pid+"_"+itemid+"_1"]?.split(",")
        } else {
          attachTableData[code] = valueObj[pid+"_"+itemid+"_1"]
        }
      }
      child.setFormData(attachTableData)
    })
  } catch (error) {
    VxeUI.modal.message({ content: `加载数据失败: ${error.message}`, status: 'error' })
  } finally {
    loading.value = false
  }
}

async function setTplItemMap() {
  try {
    const tplid = queryParam.value.tplId
    const tplItem = await allTplItems({
      tplid: tplid,
    })

    tplItem.forEach(item => {
      let strKey = item.pcode + "_" + item.xmlcode;
      tplItemMap.value[strKey] = {pid:item.pid, itemid:item.id, formTp:item.formTp, code:item.xmlcode};
    })
  } catch (error) {
    VxeUI.modal.message({ content: `加载数据失败: ${error.message}`, status: 'error' })
  }
}
</script>

<style lang="less" scoped>
.bank-report-table {
  font-family: "SimSun", "宋体", serif;
  font-size: 12px;
  color: #000;
  margin: 5px auto;
  width: 90%;
}

.custom-table {
  width: 100%;
  border: 1px solid #000;
}

.custom-table .vxe-header--column,
.custom-table .vxe-body--column {
  border-right: 1px solid #000;
  border-bottom: 1px solid #000;
  padding: 5px;
}

.content-cell {
  line-height: 1.8;
}

.table-input {
  width: 80px;
  margin: 0 2px;
}

.vxe-input {
  border-bottom: 1px solid #333;
  text-align: center;
  margin: 5px 3px;
  padding: 0;
  border-top: none;
  border-left: none;
  border-right: none;
  background: transparent;
  line-height: 50px;
}
</style>