import { FC, useEffect, useRef, useState } from 'react';
import styles from './index.less';
import { history, useLocation, useParams } from 'umi';
import { Menu, Tree, message } from 'antd';
import { deviceHardPage, managerSystemConfigList, unitAddressList } from '@/services/register';
import eventBus from '@/utils/eventBus';

interface PageProps {
  data: Array<{
    // 菜单名称
    name: string;
    // 是否展开
    check: boolean;
    // 内容是否有目录结构
    isTree?: boolean;
    // 菜单列表 ： name: 名称; url: 路由; img: 图标;
    data: Array<{ name: string; url: string; img: any; }>
  }>;
}

const LeftMenuCom: FC<PageProps> = ({ data }) => {
  const [list, setList] = useState<any>([]);
  const urlParams = useParams();
  const location = useLocation();

  const [selectedKeys, setSelectedKeys] = useState<any>([]);
  const [contextMenuPosition, setContextMenuPosition] = useState({ x: 0, y: 0 });
  const [showContextMenu, setShowContextMenu] = useState(false);
  const treeRef = useRef(null);

  const [menuItems, setMenuItems] = useState<any>([]);
  const [treeKey, setTreeKey] = useState<any>(0);

  const [treeData, setTreeData] = useState([
    {
      title: 'xxx管理系统',
      key: 'root',
      selectable: true,
      isFolder: true,
      children: [],
    }
  ]);

  const [treeData1, setTreeData1] = useState([
    {
      title: '所有单位位置',
      key: 'root',
      selectable: true,
      isFolder: true,
      children: [],
    }
  ]);

  let urlStr = `${urlParams?.fileType}${location?.search}`;

  useEffect(() => {
    menuItemsConfig();
  }, [location?.pathname])

  useEffect(() => {
    data.forEach((item, index) => {
      // 默认展开第一个
      // item.check = (index == 0 ? true : false);
      // 默认全部展开
      item.check = true;

      if (item?.isTree) setSelectedKeys([urlParams?.id])
    })
    setList([...data])

    const handleClickOutside = (e: any) => {
      if (treeRef.current && !treeRef.current.contains(e.target)) {
        // 点击了 MyTree 组件以外的地方，隐藏菜单
        setShowContextMenu(false);
      }
    };
    document.addEventListener('click', handleClickOutside);
    return () => {
      document.removeEventListener('click', handleClickOutside);
    };
  }, [])


  useEffect(() => {
    eventBus.on('getDeviceRegisterList', getDeviceRegisterList);
    eventBus.on('getUnitList', getUnitList);
    return () => {
      eventBus.off('getDeviceRegisterList', getDeviceRegisterList);
      eventBus.off('getUnitList', getUnitList);
    };
  }, [])

  const menuItemsConfig = () => {
    if (`/registerManage/deviceRegister/${urlStr}` == `${location.pathname}${location.search}`) {
      setMenuItems([
        { key: '1', label: '删除' },
        { key: '2', label: '刷新' },
      ])
      getDeviceRegisterList();
    } else if (`/registerManage/unitLocation/${urlStr}` == `${location.pathname}${location.search}`) {
      setMenuItems([
        { key: '3', label: '修改' },
        { key: '4', label: '刷新' },
        { key: '5', label: '新建' },
        { key: '6', label: '删除' }
      ])
      getUnitList();
    }
  }

  // 更新设备注册树结构数据
  const getDeviceRegisterList = async () => {
    let manager: any = [];
    let device: any = [];
    // 单位列表
    await unitAddressList({ pageNum: 1, pageSize: 200, 'unitAddress.delFlag': 0}).then((res) => {
      if (res?.result == "success") {
        res.data[0].list.forEach((val: any) => { 
          val.title = val.unitName; 
          val.key = val.unitName; 
          val.hideOperation = true;
        });
        manager = res.data[0].list.filter((val: any) => {return val.delFlag == 0})
      } else {
        message.error(res?.errorMsg);
      }
    })
    // 设备注册列表
    await deviceHardPage({ pageNumber: 1, pageSize: 200 }).then((res) => {
      if (res?.result == "success") {
        res.data[0].list.forEach((val: any) => { val.title = val.deviceName; val.key = val.id; })
        device = res.data[0].list.filter((val: any) => {return val.delFlag == 0})
      } else {
        message.error(res?.errorMsg);
      }
    })

    if (manager.length > 0) {
      manager.forEach((item: any) => {
        let children: any = [];
        device.forEach((item1: any) => {
          if (item1.unitName == item.unitName) {
            children.push({...item1,title:`${item1.unitName}-${item1.title}`});
          }
        })
        item.children = children;
      })
      setTreeData((e) => { e[0].children = manager; return e })
      setTreeKey((e: any) => { return e + 1 })
    }
  }

  // 更新单位位置管理树结构数据
  const getUnitList = (type?: string) => {
    unitAddressList({ pageNum: 1, pageSize: 200, 'unitAddress.delFlag': 0}).then((res: any) => {
      if (res.result == 'success') {
        res.data[0].list.forEach((val: any) => { val.title = val.unitName; val.key = val.id; })
        // 过滤掉delFlag == 1的数据
        res.data[0].list = res.data[0].list.filter((val: any) => {return val.delFlag == 0})
        setTreeData1((e) => { e[0].children = res.data[0].list; return e })
        setTreeKey((e: any) => { return e + 1 })
        if (type == '添加成功') {
          setSelectedKeys([Number(res.data[0].list.length)])
        }else if (type == '删除成功') {
          setSelectedKeys(['root'])
        }
      }
    })
  }

  const handleRightClick = (e: any, node: any) => {
    if (node?.isFolder || node?.hideOperation) return
    e[0] == 'root' ?  eventBus.emit('hideFlag', false) : eventBus.emit('hideFlag', true);
    e.preventDefault();
    setContextMenuPosition({ x: e.clientX, y: e.clientY }); // 记录右键菜单位置
    setSelectedKeys([node.key]); // 根据节点设置选中的 keys
    setShowContextMenu(true); // 显示右键菜单
  };

  const handleSelect = (selectedKeys: any, name: any) => {
    (selectedKeys[0] == 'root' || selectedKeys.length == 0 ) ?  eventBus.emit('hideFlag', false) : eventBus.emit('hideFlag', true);
    setSelectedKeys(selectedKeys);
  };

  const handleContextMenuClick = (e: any) => {
    let index = selectedKeys[0] - 1;
    if(e.key == '3') {
      eventBus.emit('updateUnitInfo', ['修改', treeData1[0].children[index]]);
    } else if(e.key == '6') {
      eventBus.emit('updateUnitInfo', ['删除', treeData1[0].children[index]]);
    }
    
    setShowContextMenu(false); // 隐藏右键菜单    
  };

  const nameType = {
    "设备注册": treeData,
    '单位位置管理': treeData1
  }

  const urlType = {
    "设备注册": '/registerManage/deviceRegister',
    '单位位置管理': '/registerManage/unitLocation'
  }

  return (
    <div>
      {list.map((item: any, index: number) => {
        return (
          <div key={index}>
            {/* 类型 */}
            <div className={styles.menu_item} onClick={() => {
              list[index].check = !list[index].check;
              setList([...list])
            }}>
              <div>{item.name}</div>
              <div className={styles.triangle} style={{ transform: list[index].check ? 'rotate(90deg)' : '' }}></div>
            </div>

            {/* 列表 */}
            <div className={styles.item_warp} style={{ display: list[index].check ? 'block' : 'none' }}>
              {
                item?.isTree ?
                  // 树结构
                  <div>
                    <Tree
                      key={treeKey}
                      style={{ padding: 20 }}
                      onContextMenu={(e) => e.preventDefault()}
                      onRightClick={({ event, node }) => handleRightClick(event, node)}
                      onSelect={(e, { node }) => {
                        if (node.key === 'root') {
                          history.push(`${urlType[item.name]}/${urlStr}`)
                        }

                        handleSelect(e, item.name)
                      }}
                      selectedKeys={selectedKeys}
                      treeData={nameType[item.name]}
                      blockNode={true}
                      defaultExpandAll={true}
                    />
                    {showContextMenu && (
                      <div ref={treeRef}>
                        <Menu
                          style={{
                            zIndex: 99,
                            width: 111,
                            position: 'absolute',
                            left: contextMenuPosition.x,
                            top: contextMenuPosition.y,
                            boxShadow: '0px 4px 8px 0px rgba(156, 172, 180, 0.5)'
                          }}
                          mode="vertical"
                          onClick={handleContextMenuClick}
                          items={menuItems}
                        />
                      </div>
                    )}
                  </div> :
                  // 列表item
                  item.data.map((item1: any, index1: number) => {
                    return (
                      <div className={styles.item1} key={index1} onClick={() => {
                        setSelectedKeys([])
                        history.push(`${item1.url}/${urlStr}`)
                      }}>
                        <div className={styles.item1_img}></div>
                        <div className={styles.item1_name} style={{ color: (`${location.pathname}${location.search}` == `${item1.url}/${urlStr}` ? 'red' : '') }}>
                          {item1.name}
                        </div>
                      </div>
                    )
                  })
              }
            </div>
          </div>
        )
      })}
    </div >
  )
}

export default LeftMenuCom

