import { FC, useEffect, useState } from 'react';
import { history, useLocation, useParams } from "umi";
import { message } from 'antd';
import styles from './index.less';
import ContentWarp from '@/components/ContentWarp';
import ButtonComp from '@/components/ButtonComp';
import GBase from './exeDialog/GBase';
import HGoogleEarth from './exeDialog/HGoogleEarth';
import MSXML from './exeDialog/MSXML';
import FlashPlayer from './exeDialog/FlashPlayer';
import Net from './exeDialog/Net';
import NetSP1 from './exeDialog/NetSP1';
import CoreArea from './exeDialog/CoreArea';
import DutyArea from './exeDialog/DutyArea';
import CodeManage from './exeDialog/CodeManage';
import CodeDriver from './exeDialog/CodeDriver';
import DeviceDriver from './exeDialog/DeviceDriver';
import { subjectInfo } from '@/utils/sysSubjectInfo';

const typeData = [
  // 依赖程序
  { name: 'GBase', select: false },
  { name: 'GBase升级程序', select: false },
  { name: 'FlashPlayer9', select: false },
  { name: 'MSXML4', select: false },
  { name: '.NET 2.0', select: false },
  { name: '.NET 2.0 SP1', select: false },
  { name: 'HGoogleEarth', select: false },
  { name: 'MySQLServer 5.1', select: false },
  { name: 'MyODBC 3.51', select: false },
  // 专用核心密码管理分系统
  { name: '核心区安装程序', select: false },
  { name: '执勤区安装程序', select: false },
  { name: '密钥格式管理安装程序', select: false },
  { name: '密码资源输入输出设备驱动', select: false },
  // 一体化密码机
  { name: '一体化密码机管理软件', select: false },
  { name: '一体化密码机驱动安装程序', select: false },
  // JJP903C密码钥匙
  { name: '认证服务器Install', select: false },
  { name: '用户登录组件', select: false },
]

interface PageProps { }

const InstallExe: FC<PageProps> = ({ }) => {
  const urlParams = useParams();

  const [listData, setListData] = useState<any[]>(typeData);
  const [open1, setOpen1] = useState(false); // Gbase
  const [open2, setOpen2] = useState(false); // HGoogleEarth
  const [open3, setOpen3] = useState(false); // MSXML4
  const [open4, setOpen4] = useState(false); // FlashPlayer
  const [open5, setOpen5] = useState(false); // Net2.0
  const [open6, setOpen6] = useState(false); // NET 2.0 SP1

  const [open7, setOpen7] = useState(false); // 核心区安装程序
  const [open8, setOpen8] = useState(false); // 执勤区安装程序
  const [open9, setOpen9] = useState(false); // 密码资源输入输出设备驱动

  const [open11, setOpen11] = useState(false); // 一体化密码机管理软件
  const [open12, setOpen12] = useState(false); // 一体化密码机驱动安装程序

  let sysData = localStorage.getItem(`${urlParams?.fileType}`);

  useEffect(() => {
    if (sysData) {
      let info = JSON.parse(sysData)
      if (info?.installExe) {
        setListData(info.installExe);
      } else {
        info.installExe = typeData
        localStorage.setItem(`${urlParams?.fileType}`, JSON.stringify(info));
        setListData(typeData);
      }
    } else {
      localStorage.setItem(`${urlParams?.fileType}`, JSON.stringify(subjectInfo));
    }
  }, [])

  const itemDom = (item: any, index: number) => {
    return (
      <div className={`${styles.box} ${item.select ? styles.active_box : ''}`} key={index}
        onClick={() => {

          const notRequireds = [
            'MySQLServer 5.1',
            'MyODBC 3.51',
            '密钥格式管理安装程序',
            '认证服务器Install',
            '用户登录组件'
          ]

          if (urlParams?.fileType == 'offLine') {
            notRequireds.push('执勤区安装程序')
          }

          // needArr 校验依赖程序中是否有未安装的
          let needArr = false;
          listData.slice(0, 7).forEach((k, i) => {
            if (!k.select) { needArr = true }
          })

          const updatedList = listData.map((data: any, key: number) => {
            if (data.name === item.name) {
              // 如果(选中) 或者 (不需要安装的) 就返回
              if (data.select || notRequireds.includes(item.name)) return data;

              // 依赖程序必安装的完成后才能点就右侧2块的内容（专用核心密码管理分系统、一体化密码机、JJP903C密码钥匙)
              if (key > 8 && needArr) {
                message.info('请将需要的依赖程序安装完成！');
                return data
              }

              openDialog(item.name);
              return { ...data, select: !data.select };
            }
            return data;
          });
          setListData(updatedList);
        }}>
        {item.name}
      </div>
    )
  }

  const openDialog = (name: string) => {
    switch (name) {
      case 'GBase':
        setOpen1(true)
        break;
      case 'GBase升级程序':
        if (sysData) {
          let info = JSON.parse(sysData);
          info.installExe[1].select = true;
          localStorage.setItem(`${urlParams?.fileType}`, JSON.stringify(info));
          message.success('GBase升级成功！')
        }
        break;
      case 'HGoogleEarth':
        setOpen2(true)
        break;
      case 'MSXML4':
        setOpen3(true)
        break;
      case 'FlashPlayer9':
        setOpen4(true)
        break;
      case '.NET 2.0':
        setOpen5(true)
        break;
      case '.NET 2.0 SP1':
        setOpen6(true)
        break;
      case '核心区安装程序':
        setOpen7(true)
        break;
      case '执勤区安装程序':
        setOpen8(true) 
        break;
      case '密码资源输入输出设备驱动':
        setOpen9(true)
        break;
      case '一体化密码机管理软件':
        setOpen11(true)
        break;
      case '一体化密码机驱动安装程序':
        setOpen12(true)
        break;
    }
  }

  const setInstallExe = (index: number, text: string) => {
    if (sysData) {
      let info = JSON.parse(sysData);
      info.installExe[index].select = true;
      localStorage.setItem(`${urlParams?.fileType}`, JSON.stringify(info));
      if (text == '安装失败！') {
        message.error(text)
      }else {
        message.success(text)
      }
    }
  }

  // 取消选中
  const uncheck = (name: any) => {
    if (name) {
      setListData((prevListData) => {
        return prevListData.map((e) => {
          if (e.name === name) {
            return { ...e, select: false };
          }
          return e;
        });
      });
    }
  };

  return (
    <div className={styles.exeInstall}>
      <div className={styles.title_con}>一体化对称密码管理系统</div>
      <div className='flex_acB_jE'>
        {/* 左 */}
        <ContentWarp style={{ width: '28.5%', padding: '7vh 3vh 3vh 3vh' }} text={'依赖程序'}>
          {listData.slice(0, 9).map((item: any, index: number) => { return itemDom(item, index) })}
        </ContentWarp>

        {/* 中 */}
        <ContentWarp style={{ width: '28.5%', padding: '7vh 3vh 3vh 3vh' }} text={'专用核心密码管理分系统'}>
          {listData.slice(9, 13).map((item: any, index: number) => { return itemDom(item, index) })}
        </ContentWarp>

        {/* 右 */}
        <div style={{ width: '28.5%' }}>
          <ContentWarp style={{ marginBottom: '8%', padding: '7vh 3vh 3vh 3vh', height: '25.7vh' }} text={'一体化密码机'}>
            {listData.slice(13, 15).map((item: any, index: number) => { return itemDom(item, index) })}
          </ContentWarp>

          <ContentWarp text={'JJP903C密码钥匙'} style={{ padding: '7vh 3vh 3vh 3vh', height: '25.7vh' }}>
            {listData.slice(15, 17).map((item: any, index: number) => { return itemDom(item, index) })}
          </ContentWarp>
        </div>
      </div>
      <div className='flex_jE' style={{ marginTop: '3vh', paddingRight: '4.5vh' }}>
        <ButtonComp text={'退出'} onClick={() => { }} />
      </div>

      {/* 依赖程序安装--弹窗 */}
      <GBase
        open={open1}
        onCancel={(e) => { uncheck(e); setOpen1(false) }}
        setInstallExe={(i, t) => { setInstallExe(i, t) }}
      />
      <HGoogleEarth
        open={open2}
        onCancel={(e) => { uncheck(e); setOpen2(false) }}
        setInstallExe={(i, t) => { setInstallExe(i, t) }} />
      <MSXML
        open={open3}
        onCancel={(e) => { uncheck(e); setOpen3(false) }}
        setInstallExe={(i, t) => { setInstallExe(i, t) }} />
      <FlashPlayer
        open={open4}
        onCancel={(e) => { uncheck(e); setOpen4(false) }}
        setInstallExe={(i, t) => { setInstallExe(i, t) }} />
      <Net
        open={open5}
        onCancel={(e) => { uncheck(e); setOpen5(false) }}
        setInstallExe={(i, t) => { setInstallExe(i, t) }} />
      <NetSP1
        open={open6}
        onCancel={(e) => { uncheck(e); setOpen6(false) }}
        setInstallExe={(i, t) => { setInstallExe(i, t) }} />

      {/* 专用核心密码管理分系统--弹窗 */}
      <CoreArea
        open={open7}
        onCancel={(e) => { uncheck(e); setOpen7(false) }}
        setInstallExe={(i, t) => { setInstallExe(i, t) }} />

      <DutyArea
        open={open8}
        onCancel={(e) => { uncheck(e); setOpen8(false) }}
        setInstallExe={(i, t) => { setInstallExe(i, t) }} />

      <DeviceDriver
        open={open9}
        onCancel={(e) => { uncheck(e); setOpen9(false) }}
        setInstallExe={(i, t) => { setInstallExe(i, t) }} />

      {/* 一体化密码机--弹窗 */}
      <CodeManage 
        open={open11} 
        onCancel={(e) => { uncheck(e); setOpen11(false) }}
        setInstallExe={(i, t) => { setInstallExe(i, t) }} />

      <CodeDriver
        open={open12}
        onCancel={(e) => { uncheck(e); setOpen12(false) }}
        setInstallExe={(i, t) => { setInstallExe(i, t) }} />
    </div>
  )
}

export default InstallExe;