import {connect} from "umi";
import type {CurrentUser} from "umi";
import type {ConnectState} from "@/models/connect";
import React, {useRef, useState} from "react";
import ProCard from "@ant-design/pro-card";
import {MenuFoldOutlined} from "@ant-design/icons";
import type {FormInstance} from "antd";
import {Avatar, Button, Menu, message, Space, Spin, Tree,Drawer} from "antd";
import useRequest from "@ahooksjs/use-request";
import {getServerpartTree, handleCallLogs, handleGetDate} from "@/services/options";
import type {ActionType} from "@ant-design/pro-table";
import ProTable from "@ant-design/pro-table";
import ReactHTMLTableToExcel from "react-html-table-to-excel";
import SubMenu from "antd/lib/menu/SubMenu";
import moment from "moment";
import {handleGetABNORMALAUDITList} from "@/pages/reports/audit/abnormalAudit/service";
import PageTitleBox from "@/components/PageTitleBox";


const abnormalAudit: React.FC<{ currentUser: CurrentUser}> = (props) => {
  const { currentUser } = props
  const downloadBtnRef = useRef<any>()
  const actionRef = useRef<ActionType>();
  const formRef = useRef<FormInstance>();
  const [reqDetailList, setReqDetailList] = useState<any>(); // 合计项数据源
  const [printOut, setPrintOut] = useState<any>(); // 打印数据的内容
  const [collapsible, setCollapsible] = useState<boolean>(false)
  const [treeView,setTreeView] = useState<any>()
  // 加载服务区树
  const { loading: treeLoading, data: treeViews } = useRequest(async () => {
    const data = await getServerpartTree(currentUser?.ProvinceCode, currentUser?.CityAuthority, true, true, true)
    console.log('data',data)
    setTreeView(data)
    return data
  })
// 树相关的属性和方法
  const [selectedId, setSelectedId] = useState<string>()
// 导出的加载效果
  const [showLoading,setShowLoading] = useState<boolean>(false)
  // 是否显示打印的表格
  const [showExportTable,setShowExportTable] = useState<boolean>(false)
  const [currenMenu, setCurrenMenu] = useState<any>(); // 当前选中左侧菜单的服务区节点
  // 显示详情抽屉
  const [showDetailDrawer,setShowDetailDrawer] = useState<boolean>(false)
  // 选择的当行详情
  const [currentRow,setCurrentRow] = useState<any>()

  const columns: any = [
    {
      title: '统计时间',
      dataIndex: 'search_date',
      valueType: 'dateRange',
      hideInTable: true,
      hideInDescriptions: true,
      colSize: 1,
      initialValue: [moment().add(-1, 'month').format('YYYY-MM-DD'), moment().add(-1,'day').format('YYYY-MM-DD')],
      search: {
        transform: (value) => {
          return {
            CHECK_STARTDATE_SEARCH: value[0],
            CHECK_ENDDATE_SEARCH: value[1],
          };
        },
      },
      fieldProps: {
        disabledDate: (current: any) => current && current > moment()
      }
    },
    {
      title:'序号',
      width: 60,
      dataIndex: '',
      valueType: 'index',
      hideInSearch: true
    },
    {
      title:'服务区名称',
      width: 150,
      ellipsis: true,
      dataIndex: 'SERVERPART_NAME',
      hideInSearch: true
    },
    {
      title:'门店名称',
      width: 150,
      ellipsis: true,
      dataIndex: 'SHOPNAME',
      hideInSearch: true,
      render:(_,record)=>{
        return record?.SHOPNAME?<a onClick={()=>{
          setCurrentRow(record)
          setShowDetailDrawer(true)
        }}>{record?.SHOPNAME}</a>:''
      }
    },
    {
      title:'总销售额',
      width: 120,
      valueType: 'digit',
      dataIndex: 'TOTALSELLAMOUNT',
      hideInSearch: true
    },
    {
      title:'长短款',
      width: 120,
      valueType: 'digit',
      dataIndex: 'DIFFERENT_PRICE',
      hideInSearch: true
    },
    {
      title:'稽核金额/对客现金',
      width: 180,
      dataIndex: 'CHECK_CASHPAY/CASH_PAYMENT',
      hideInSearch: true,
      render:(_,record)=>{
        return `${record?.CHECK_CASHPAY || '0'}/${record?.CASH_PAYMENT || '0'}`
      }
    },
    {
      title:'间隔时长(分)',
      width: 120,
      dataIndex: 'TIME_INTERVAL',
      hideInSearch: true
    },
    {
      title:'结账时间',
      width: 180,
      dataIndex: 'ENDACCOUNT_DATE',
      hideInSearch: true,
      render:(_,record)=>{
        return record?.ENDACCOUNT_DATE?handleGetDate(record?.ENDACCOUNT_DATE):'-'
      }
    },
    {
      title:'稽查时间',
      width: 180,
      dataIndex: 'CHECK_ENDDATE',
      hideInSearch: true,
      render:(_,record)=>{
        return record?.CHECK_ENDDATE?handleGetDate(record?.CHECK_ENDDATE):'-'
      }
    },
    {
      title:'起始时间',
      width: 180,
      dataIndex: 'CHECK_STARTDATE',
      hideInSearch: true,
      render:(_,record)=>{
        return record?.CHECK_STARTDATE?handleGetDate(record?.CHECK_STARTDATE):'-'
      }
    },
    {
      title:'稽查类型',
      width: 120,
      dataIndex:'CHECK_TYPE',
      valueType: 'select',
      valueEnum:{
        "现场稽查":"现场稽查",
        "区域稽查":"区域稽查",
        "公司稽查":"公司稽查",
      }
    },
    {
      title:'稽核人员',
      width: 120,
      dataIndex: 'WORKER_NAME',
      hideInSearch: true
    },
    {
      title:'收银人员',
      width: 120,
      dataIndex: 'CASHIER_NAME',
      ellipsis: true,
      hideInSearch: true
    },
  ]

  const exportTable = (e) => {
    e.stopPropagation();                                            // 防止Collapse组件收起
    const main = document.getElementsByClassName('saleReportHideBox')[0]
    const thead = main.querySelector('thead').cloneNode(true);  // 深克隆DOM节点
    const tbody = main.querySelector('tbody').cloneNode(true);  // 深克隆DOM节点
    const container = document.querySelector('#hiddenBox');

    const tempTable = document.createElement('table');
    tempTable.appendChild(thead);
    tempTable.appendChild(tbody);

    tempTable.setAttribute('id', 'table-to-xls-abnormalAudit');                    // 给table添加id，值与按钮上的table字段对应

    container.appendChild(tempTable);                                // 把创建的节点添加到页面容器中

    setShowLoading(false)

    downloadBtnRef.current.handleDownload();
    setShowExportTable(false)
    tempTable.remove() // 防止重复打印一个内容
  }
  // 查询的条件
  const [searchParams,setSearchParams] = useState<any>()


  return (
    <div ref={(el) => {
      // 打印报表
      if (!reqDetailList || reqDetailList.length === 0) return;
      setPrintOut(el);
    }} >

      {
        showLoading ?
          <div
            style={{
              width: '100%',
              height: '100%',
              background: 'rgba(0,0,0,0.1)',
              position: 'fixed',
              zIndex: 5,
              display: 'flex',
              alignItems: 'center',
              justifyContent: 'center'
            }}
          >
            <div style={{
              display: 'flex',
              alignItems: 'center',
              justifyContent: 'center',
              padding: '15px 20px 10px',
              background: '#fff',
              borderRadius: '8px',
              width: '200px'
            }}>
              <Spin/>
              <span style={{marginLeft: '5px'}}>数据导出中...</span>
            </div>
          </div> : ''
      }

      <div className={'saleReportHideBox'} style={{position: 'fixed', zIndex: -1, top: 0, left: 0}}>
        {
          showExportTable && reqDetailList && reqDetailList.length > 0 ?
            <ProTable
              columns={columns}
              dataSource={reqDetailList}
              pagination={false}
              expandable={{
                defaultExpandAllRows: true
              }}
            /> : ''
        }
      </div>
      <div id='hiddenBox' style={{position: 'fixed', zIndex: -1, top: 0, left: 0}}/>

      <div style={{backgroundColor: '#fff',display:'flex'}}>
        <ProCard
          style={{width:!collapsible ? "300px" : "60px"}}
          className="pageTable-leftnav"
          bodyStyle={{padding: 0, paddingTop: 20, paddingLeft: 20,width:!collapsible ? "300px" : "60px"}}
          extra={<MenuFoldOutlined onClick={() => {
            setCollapsible(!collapsible)
          }}/>}
          colSpan={!collapsible ? "300px" : "60px"}
          title={!collapsible ? "请选择服务区" : ""}
          headerBordered
          collapsed={collapsible}
        >
          {treeView && treeView.length > 0 ? <Tree
            checkable
            treeData={[{
              label: '全部',
              value: 0,
              key: '0-0',
              children: treeView
            }]}
            fieldNames={{
              title: "label",
              key: "key"
            }}
            blockNode
            defaultExpandedKeys={['0-0']}
            onCheck={(checkedKeys: React.Key[] | any, info) => {
              const selectedIds = info.checkedNodes.filter(n => n?.type === 1)
              setSelectedId(selectedIds.map(n => n?.value)?.toString() || '')
              // actionRef?.current?.reload()
              // getData(selectedIds.map(n => n?.value)?.toString() || '')
            }}
            // switcherIcon={<PlusOutlined />}
          /> : ''}
        </ProCard>
        <div style={{
          width:!collapsible?'calc(100% - 300px)':'calc(100% - 60px)',
          paddingTop: 0,
          paddingBottom: 0,
          paddingRight: 0
        }}>
          <ProTable
            actionRef={actionRef}
            formRef={formRef}
            columns={columns}
            bordered
            headerTitle={<PageTitleBox props={props} />}
            search={{span: 6}}
            scroll={{x: 1500}}
            request={async(params)=>{
              if (!selectedId){
                return
              }
              const req = {
                SearchParameter:{
                  ...params,
                  SERVERPART_ID: selectedId
                },
                PageIndex: 1,
                PageSize: 999999
              }
              handleCallLogs()
              setSearchParams(params)
              const data = await handleGetABNORMALAUDITList(req)
              console.log('data',data)
              if (data && data.length>0){
                setReqDetailList(data)
                return {data,success: true}
              }
              setReqDetailList([])
              return {data:[],success: true}
            }}
            toolbar={{
              actions: [
                <span style={{visibility: 'hidden'}}>
                  <ReactHTMLTableToExcel
                    buttonText={'导出excel'}
                    ref={downloadBtnRef}
                    table="table-to-xls-abnormalAudit"
                    filename={`单品销售排行统计${searchParams?.CHECK_STARTDATE_SEARCH}-${searchParams?.CHECK_ENDDATE_SEARCH}`}
                    sheet="sheet1"
                  />
                </span>,
                <Button
                  key="new"
                  type="primary"
                  onClick={(e) => {
                    if (reqDetailList && reqDetailList.length > 0) {
                      setShowLoading(true)
                      setTimeout(() => {
                        setShowExportTable(true)
                        setTimeout(() => {
                          exportTable(e)
                        }, 100)
                      }, 100)
                    } else {
                      message.error('暂无数据可导出！')
                    }
                  }}
                >
                  导出excel
                </Button>
              ]
            }}
          />
        </div>
      </div>

      <Drawer
        width="80%"
        className="project-drawer"
        visible={showDetailDrawer} // 抽屉弹框是否显示状态
        onClose={() => { // 关闭抽屉 则在清空选中行数据 并 设置抽屉状态为关闭
          setShowDetailDrawer(false);
          setCurrentRow(undefined);
        }}
        destroyOnClose
        bodyStyle={{backgroundColor: "#f9f9f9", padding: 16}}
        closable={false}
      >

      </Drawer>
    </div>
  )
}

export default connect(({user}: ConnectState) => ({
  currentUser: user.currentUser
}))(abnormalAudit);
