<template>
  <div class="search">
    <a-card style="border-radius: 12px">
      <div class="ns-form-title">
        <div class="title">查询</div>
        <div class="operation">
          <a-button type="primary" @click="changeParentData"> 返回 </a-button>
        </div>
      </div>
      <a-form layout="inline">
        <a-form-item>
          <a-select
            v-model:value="queryParams.accountType"
            style="width: 200px"
            placeholder="请输入账户类型">
            <a-select-option :value="1">全国账户</a-select-option>
            <a-select-option :value="2">地方账户</a-select-option>
            <a-select-option :value="3">CCER</a-select-option>
          </a-select>
        </a-form-item>
        <a-form-item>
          <a-cascader
            v-model:value="queryParams.transactionType"
            multiple
            style="width: 200px"
            :options="options"
            placeholder="请选择交易类型"
            suffix-icon="Shopping Around">
            <template #tagRender="data">
              <a-tag :key="data.value" color="blue">{{ data.label }}</a-tag>
            </template>
          </a-cascader>
        </a-form-item>
        <a-form-item>
          <a-date-picker
            style="width: 200px"
            v-model:value="queryParams.year"
            placeholder="请选择账期"
            picker="year"
            valueFormat="YYYY" />
        </a-form-item>
        <a-form-item>
          <a-button type="primary" @click="searchTableList">查询</a-button>
          <a-button html-type="submit" style="margin-left: 6px" @click="reset">重置</a-button>
        </a-form-item>
      </a-form>
    </a-card>
  </div>
  <div style="display: flex; margin-top: 20px; height: calc(84% - 20px)">
    <div class="detailTable">
      <a-card>
        <div class="ns-form-title">
          <div class="title">交易明细</div>
          <div class="operation">
            <a-button type="primary" @click="addDetail">新增</a-button>
            <a-button type="primary" style="margin-left: 6px">导入</a-button>
            <a-button type="primary" style="margin-left: 6px">导出</a-button>
            <a-button type="primary" style="margin-left: 6px">批量删除</a-button>
          </div>
        </div>
        <a-table
          :columns="columns"
          :data-source="data"
          @change="onChange"
          :rowSelection="{
            selectedRowKeys: selectedRowKeys,
            onChange: onSelectionChange,
          }"
          :scroll="{ x: 1500, y: 400 }"
          :pagination="false">
          <template #bodyCell="{ column, text, record }">
            <template v-if="column.dataIndex === 'accountType'">
              <span v-if="record.accountType">{{ record.accountType.label }}</span>
            </template>
            <template v-if="column.key === 'action'">
              <span>
                <a @click="editData(record)">编辑</a>
                <a-divider type="vertical" />
                <a @click="delData(record)">删除</a>
              </span>
            </template>
          </template>
        </a-table>
        <a-pagination
          :current="queryParams.pageNum"
          :total="total"
          :page-size="queryParams.pageSize"
          style="display: flex; justify-content: center; margin-top: 16px"
          :show-size-changer="true"
          :show-quick-jumper="true"
          @change="onChange" />
      </a-card>
    </div>
    <div class="total">
      <a-table :columns="totalColumns" :data-source="totalData" bordered :pagination="false">
        <template #bodyCell="{ column, text }">
          <template v-if="column.dataIndex === 'name'">
            <a>{{ text }}</a>
          </template>
        </template>
      </a-table>
    </div>
  </div>
  <!-- 新增报告弹窗 -->
  <a-drawer
    :width="500"
    :visible="visible"
    :body-style="{ paddingBottom: '80px' }"
    :footer-style="{ textAlign: 'right' }"
    destroyOnClose
    @close="onClose">
    <a-form
      ref="formRef"
      :model="formState"
      :rules="rules"
      :label-col="labelCol"
      :wrapper-col="wrapperCol">
      <a-form-item ref="name" label="账户类型" name="accountType">
        <a-select v-model:value="formState.accountType" placeholder="请输入账户类型">
          <a-select-option value="1">全国账户</a-select-option>
          <a-select-option value="2">地方账户</a-select-option>
          <a-select-option value="3">CCER</a-select-option>
        </a-select>
      </a-form-item>
      <a-form-item ref="name" label="交易类型" name="transactionType">
        <a-cascader
          v-model:value="formState.transactionType"
          :options="options"
          placeholder="请选择交易类型" />
      </a-form-item>
      <a-form-item ref="name" label="交易日期" name="transactionDate">
        <a-date-picker v-model:value="formState.transactionDate" valueFormat="YYYY-MM-DD" />
      </a-form-item>
      <a-form-item ref="name" label="交易数量" name="transactionQuantity">
        <a-input v-model:value="formState.transactionQuantity" placeholder="请输入交易数量" />
      </a-form-item>
      <a-form-item ref="name" label="发生金额" name="amountIncurredValue">
        <a-input v-model:value="formState.amountIncurredValue" placeholder="请输入发生金额" />
      </a-form-item>
      <a-form-item ref="name" label="交易对象" name="tradingPartner">
        <a-input v-model:value="formState.tradingPartner" placeholder="请输入交易对象" />
      </a-form-item>
      <a-form-item ref="name" label="交易凭证" name="tradingPartner">
        <a-upload
          v-model:file-list="fileList"
          name="file"
          action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
          :headers="headers"
          @change="handleChange">
          <a-button>
            <upload-outlined></upload-outlined>
            上传
          </a-button>
        </a-upload>
      </a-form-item>
    </a-form>
    <template #footer>
      <a-button style="margin-right: 8px" @click="onClose">取消</a-button>
      <a-button type="primary" @click="onSubmit">确定</a-button>
    </template>
  </a-drawer>
</template>

<script lang="ts" setup>
  import { ref, defineEmits, toRaw } from 'vue';
  import { http } from '/nerv-lib/util/http';
  import { UploadOutlined } from '@ant-design/icons-vue';
  import type { UploadChangeParam } from 'ant-design-vue';
  import { Pagination, Modal, message } from 'ant-design-vue';
  import { carbonAssets, carbonEmissionFactorLibrary } from '/@/api/carbonEmissionFactorLibrary';
  defineOptions({
    energyType: 'carbonAssets', // 与页面路由name一致缓存才可生效
    components: {
      'a-pagination': Pagination,
    },
  });
  // 父组件id
  const props = defineProps({
    parentId: {
      type: Number,
    },
  });
  const orgId = ref('');
  const result = JSON.parse(sessionStorage.getItem('ORGID')!);
  orgId.value = result;
  const fetch = (api, params = { orgId }) => {
    return http.post(api, params);
  };
  // 详情部分变量
  const selectedRowKeys = ref([]);
  const onSelectionChange = (selectedKeys, selectedRows) => {
    selectedRowKeys.value = selectedKeys;
  };
  const total = ref<number>();
  const thisYear = ref(new Date().getFullYear().toString());
  const queryParams = ref({
    pageNum: 1,
    pageSize: 10,
    orgId: orgId.value,
    accountType: props.parentId,
    year: thisYear.value,
  });
  const searchTableList = () => {
    getDetailList();
  };
  // 获取左侧列表数据
  const getDetailList = () => {
    fetch(carbonAssets.carbonDetailsList, queryParams.value).then((res) => {
      data.value = res.data.records;
    });
  };
  getDetailList();
  const columns = [
    {
      title: '序号',
      customRender: (text: any) => {
        return text.index + 1;
      },
    },
    {
      title: '资产类别',
      dataIndex: 'accountType',
    },
    {
      title: '交易方式',
      dataIndex: 'transactionTypeName',
    },
    {
      title: '交易日期',
      dataIndex: 'transactionDate',
      sorter: (a, b) => a.transactionDate - b.transactionDate,
    },
    {
      title: '本期收入(tCO2)',
      dataIndex: 'income',
      sorter: (a, b) => a.income - b.income,
    },
    {
      title: '本期支出(tCO2)',
      dataIndex: 'expenditure',
      sorter: (a, b) => a.expenditure - b.expenditure,
    },
    {
      title: '发生金额(￥）',
      dataIndex: 'amountIncurredValue',
    },
    {
      title: '交易对象',
      dataIndex: 'tradingPartner',
    },
    {
      title: '更新人',
      dataIndex: 'updateUser',
    },
    {
      title: '更新时间',
      dataIndex: 'updateTime',
    },
    {
      title: '操作',
      key: 'action',
      width: 130,
    },
  ];
  const data = ref([]);
  const reset = () => {
    queryParams.value = {
      pageNum: 1,
      pageSize: 10,
      orgId: orgId.value,
      year: new Date().getFullYear(),
    };
    getDetailList();
  };
  const editData = (record) => {
    getDictList();
    visible.value = true;
    formState.value.id = record.id;
    setTimeout(() => {
      let selectDevice = ref([Number(record.transactionType)]);
      findParentIds(options.value, record.transactionType, selectDevice.value);
      record.transactionType = selectDevice;
      formState.value.transactionType = record.transactionType;
      formState.value = record;
    }, 500);
  };
  // 定义一个递归函数来查找每一级的id 设备类型回显 层级方法
  function findParentIds(tree: any, targetId: number, result: any) {
    for (let item of tree) {
      if (item.children && item.children.length > 0) {
        if (item.children.some((child: any) => child.value === targetId)) {
          result.unshift(item.value); // 将当前节点的id添加到结果数组的最前面
          findParentIds(tree, item.value, result); // 递归查找父级节点的id
          break; // 找到后可以退出循环
        }
      }
    }
  }
  const delData = (record) => {
    Modal.confirm({
      title: '警告',
      content: '确定要删除吗?',
      okText: '确定',
      okType: 'primary',
      cancelText: '取消',
      onOk() {
        fetch(carbonAssets.delete, { id: record.id }).then((res) => {
          message.success('操作成功！');
          getDetailList();
        });
      },
      onCancel() {
        console.log('Cancel');
      },
    });
  };
  // 分页器
  const onChange = (pageNumber: number, size: number) => {
    queryParams.value.pageNum = pageNumber;
    queryParams.value.pageSize = size;
    getDetailList();
  };
  // 新增相关数据
  const visible = ref(false);
  const formState = ref({
    orgId: orgId.value,
  });
  const formRef = ref();
  const labelCol = { span: 5 };
  const wrapperCol = { span: 19 };
  const options = ref([]);
  // 获取字典值
  const getDictList = () => {
    fetch(carbonEmissionFactorLibrary.dictionaryUnitManagement, { grp: 'TRANSACTION_TYPE' }).then(
      (res) => {
        options.value = res.data;
        options.value = options.value.map((item) => ({
          value: item.id,
          label: item.cnValue,
          children: item.children
            ? item.children.map((child) => ({
                value: child.id,
                label: child.cnValue,
              }))
            : [],
        }));
      },
    );
  };
  getDictList();
  // 点击新增
  const addDetail = () => {
    visible.value = true;
    getDictList();
  };
  const onSubmit = () => {
    formRef.value
      .validate()
      .then(() => {
        console.log('values', formState, toRaw(formState));
        if (formState.value.transactionType) {
          formState.value.transactionType = formState.value.transactionType.join(',').split(',')[1];
        }
        fetch(carbonAssets.createOrUpdate, formState.value).then((res) => {
          message.success('操作成功！');
          visible.value = false;
          getDetailList();
        });
      })
      .catch((error) => {
        console.log('error', error);
      });
  };
  // 定义form表单的必填
  const rules: Record<string, Rule[]> = {
    accountType: [{ required: true, message: '请输入账户类型', trigger: 'change' }],
    transactionType: [{ required: true, message: '请选择交易类型', trigger: 'change' }],
    transactionDate: [{ required: true, message: '请选择交易日期', trigger: 'change' }],
    transactionQuantity: [{ required: true, message: '请输入交易数量', trigger: 'change' }],
    amountIncurredValue: [{ required: true, message: '请输入发生金额', trigger: 'change' }],
    tradingPartner: [{ required: true, message: '请输入交易对象', trigger: 'change' }],
  };
  // 关闭新增抽屉
  const onClose = () => {
    visible.value = false;
    formState.value = {};
    formRef.value.resetFields();
  };
  // 统计表格
  const getTotalTable = () => {
    fetch(carbonAssets.quotaStatistics, queryParams.value).then((res) => {
      totalData.value = res.data;
    });
  };
  getTotalTable();
  const totalColumns = [
    {
      title: '统计类型',
      dataIndex: 'statisticType',
    },
    {
      title: '小计',
      dataIndex: 'subtotal',
    },
    {
      title: '合计',
      dataIndex: 'amountTo',
    },
  ];

  const totalData = ref([]);
  // 点击返回
  const emit = defineEmits(['change-data']);
  const changeParentData = () => {
    emit('change-data', true);
  };
</script>

<style lang="less" scoped>
  .ns-form-title {
    font-weight: bold;
    user-select: text;
    padding-bottom: 10px;
    display: flex;
    justify-content: space-between;
  }
  .title {
    text-align: left;
    height: 32px;
    line-height: 32px;
    font-weight: bold;
    user-select: text;
    position: relative;
    padding-left: 9px;
  }
  .title::before {
    content: '';
    position: absolute;
    left: 0;
    top: 50%;
    transform: translateY(-50%);
    height: 13px;
    width: 3px;
    border-radius: 1px;
    background-color: #2778ff;
  }
  :deep(.ant-card-body) {
    padding: 16px;
  }
  .search {
    height: 16%;
  }
  .detailTable {
    width: 65%;
    margin-right: 20px;
    height: 100%;
    background: white;
    border-radius: 12px;
  }
  .total {
    width: calc(35% - 20px);
    height: 100%;
    background: white;
    border-radius: 12px;
  }
</style>
