import KFIcon from '@/components/KFIcon';
import ModelEvolution from '@/pages/Model/components/ModelEvolution';
import { to } from '@/utils/promise';
import { useParams, useSearchParams } from '@umijs/max';
import { Flex, Tabs } from 'antd';
import { useEffect, useState } from 'react';
import { ResourceData, ResourceType, resourceConfig } from '../../config';
import ResourceVersion from '../ResourceVersion';
import styles from './index.less';

// 这里值小写是因为值会写在 url 中
export enum ResourceInfoTabKeys {
  Introduction = 'introduction', // 简介
  Version = 'version', // 版本
  Evolution = 'evolution', // 演化
}

type ResourceIntroProps = {
  resourceType: ResourceType;
};

const ResourceIntro = ({ resourceType }: ResourceIntroProps) => {
  const [info, setInfo] = useState<ResourceData>({} as ResourceData);
  const locationParams = useParams();
  const [searchParams] = useSearchParams();
  const defaultTab = searchParams.get('tab') || ResourceInfoTabKeys.Introduction;
  let versionParam = searchParams.get('version');
  const [versionList, setVersionList] = useState([]);
  const [version, setVersion] = useState<string | undefined>(undefined);
  const [activeTab, setActiveTab] = useState<string>(defaultTab);
  const resourceId = Number(locationParams.id);
  const config = resourceConfig[resourceType];
  const typeName = config.name; // 数据集/模型

  useEffect(() => {
    getModelByDetail();
    getVersionList();
  }, [resourceId]);

  // 获取详情
  const getModelByDetail = async () => {
    const request = config.getInfo;
    const [res] = await to(request(resourceId));
    if (res) {
      setInfo(res.data);
    }
  };

  // 获取版本列表
  const getVersionList = async () => {
    const request = config.getVersions;
    const [res] = await to(request(resourceId));
    if (res && res.data && res.data.length > 0) {
      setVersionList(
        res.data.map((item: string) => {
          return {
            label: item,
            value: item,
          };
        }),
      );
      if (versionParam && res.data.includes(versionParam)) {
        setVersion(versionParam);
        versionParam = null;
      } else {
        setVersion(res.data[0]);
      }
    } else {
      setVersion(undefined);
    }
  };

  // 版本变化
  const handleVersionChange = (value: string) => {
    setVersion(value);
  };

  const items = [
    {
      key: ResourceInfoTabKeys.Introduction,
      label: `${typeName}简介`,
      icon: <KFIcon type="icon-moxingjianjie" />,
      children: (
        <>
          <div className={styles['resource-intro__title']}>简介</div>
          <div className={styles['resource-intro__intro']}>{info.description}</div>
        </>
      ),
    },
    {
      key: ResourceInfoTabKeys.Version,
      label: `${typeName}文件/版本`,
      icon: <KFIcon type="icon-moxingwenjian" />,
      children: (
        <ResourceVersion
          resourceType={resourceType}
          resourceId={resourceId}
          resourceName={info.name}
          isPublic={info.available_range === 1}
          versionList={versionList}
          version={version}
          isActive={activeTab === ResourceInfoTabKeys.Version}
          getVersionList={getVersionList}
          onVersionChange={handleVersionChange}
        ></ResourceVersion>
      ),
    },
  ];

  if (resourceType === ResourceType.Model) {
    items.push({
      key: ResourceInfoTabKeys.Evolution,
      label: `模型演化`,
      icon: <KFIcon type="icon-moxingyanhua1" />,
      children: (
        <ModelEvolution
          resourceId={resourceId}
          versionList={versionList}
          version={version}
          isActive={activeTab === ResourceInfoTabKeys.Evolution}
          onVersionChange={handleVersionChange}
        ></ModelEvolution>
      ),
    });
  }

  const infoTypePropertyName = config.infoTypePropertyName as keyof ResourceData;
  const infoTagPropertyName = config.infoTagPropertyName as keyof ResourceData;

  return (
    <div className={styles['resource-intro']}>
      <div className={styles['resource-intro__top']}>
        <div className={styles['resource-intro__top__name']}>{info.name}</div>
        <Flex align="center">
          <div className={styles['resource-intro__top__tag']}>
            {typeName} id：{info.id}
          </div>
          {info[infoTypePropertyName] && (
            <div className={styles['resource-intro__top__tag']}>
              {info[infoTypePropertyName] || '--'}
            </div>
          )}
          {info[infoTagPropertyName] && (
            <div className={styles['resource-intro__top__tag']}>
              {info[infoTagPropertyName] || '--'}
            </div>
          )}
        </Flex>
      </div>
      <div className={styles['resource-intro__bottom']}>
        <Tabs activeKey={activeTab} items={items} onChange={(key) => setActiveTab(key)}></Tabs>
      </div>
    </div>
  );
};
export default ResourceIntro;
