import { useCallback } from 'react';
import { useTranslation } from 'react-i18next';
import Menu from 'semantic-ui-react/dist/commonjs/collections/Menu';
import Label from 'semantic-ui-react/dist/commonjs/elements/Label';
import Popup from 'semantic-ui-react/dist/commonjs/modules/Popup';
import Tab from 'semantic-ui-react/dist/commonjs/modules/Tab';
import { PkmImage } from 'common';
import { PokeInfo } from 'components';
import { Summary, Tip } from 'components/Pokestats/elements';
import { Detail } from 'components/Tracker/elements';
import { POKEMAP } from 'constants/pokemon';
import { selectCaught, selectFailed, selectFainted, selectTeam } from 'selectors';
import useStore from 'store';
import { ReactComponent as CaughtSVG } from 'assets/svg/caught.svg';
import { ReactComponent as FailedSVG } from 'assets/svg/failed.svg';
import { ReactComponent as FaintedSVG } from 'assets/svg/fainted.svg';
import { ReactComponent as SummarySVG } from 'assets/svg/summary.svg';
import { ReactComponent as TeamSVG } from 'assets/svg/team.svg';
import styles from './Pokestats.module.scss';

function Pokestats(): JSX.Element {
  const { t } = useTranslation('stats');
  const darkMode = useStore(useCallback((state) => state.darkMode, []));
  const teamPokemon = useStore(selectTeam);
  const faintedPokemon = useStore(selectFainted);
  const caughtPokemon = useStore(selectCaught);
  const failedPokemon = useStore(selectFailed);

  const panes = [
    {
      menuItem: (
        <Menu.Item key="overview">
          <SummarySVG className={styles.team} />
          {t('summary')}
        </Menu.Item>
      ),
      render: () => (
        <Tab.Pane>
          <Summary />
        </Tab.Pane>
      ),
    },
    {
      menuItem: (
        <Menu.Item key="Team">
          <TeamSVG className={styles.team} />
          {t('Team')}
          <Label>{teamPokemon?.length || 0}</Label>
        </Menu.Item>
      ),
      render: () => (
        <Tab.Pane attached={false} className={`${styles.box} ${styles.team}`}>
          {teamPokemon?.length > 0 ? (
            teamPokemon?.map((enc, i) => {
              const foundPokemon = POKEMAP.get(enc.pokemon);
              return (
                <div className={styles.member} key={`team-${enc.id}-${Number(i) + 1}`}>
                  <Popup
                    key={`team-${enc.id}-${i + 1}`}
                    inverted={darkMode}
                    on="click"
                    pinned
                    position="top center"
                    trigger={
                      <div className={styles.pokeball} data-testid={`team-${enc.id}`}>
                        <div className={styles.image}>
                          <PkmImage name={foundPokemon?.text} shiny={enc?.details?.shiny} />
                        </div>
                        <div className={styles.center} />
                      </div>
                    }
                  >
                    <PokeInfo encounter={enc} pokemon={foundPokemon} />
                  </Popup>
                  <div className={styles.memberText}>
                    <span>{enc.nickname || foundPokemon?.text}</span>
                    {!!enc?.details?.level && <span>Lv. {enc.details.level}</span>}
                  </div>
                  <div className={styles.lineOne} />
                  <div className={styles.lineTwo} />
                  <div className={styles.details}>
                    <Detail encounter={enc} />
                  </div>
                </div>
              );
            })
          ) : (
            <Tip missing={t('Team')} />
          )}
        </Tab.Pane>
      ),
    },
    {
      menuItem: (
        <Menu.Item key="Caught">
          <CaughtSVG className={styles.team} />
          {t('Caught')}
          <Label>{caughtPokemon?.length || 0}</Label>
        </Menu.Item>
      ),
      render: () => (
        <Tab.Pane attached={false} className={`${styles.box} ${styles.grass}`}>
          {caughtPokemon?.length > 0 ? (
            caughtPokemon?.map((enc, i) => {
              const foundPokemon = POKEMAP.get(enc.pokemon);
              return (
                <Popup
                  key={`caught-${enc.id}-${Number(i) + 1}`}
                  inverted={darkMode}
                  on="click"
                  pinned
                  position="top center"
                  trigger={
                    <div className={styles.pokemon} data-testid={`caught-${enc.id}`}>
                      <PkmImage name={foundPokemon?.text} shiny={enc?.details?.shiny} />
                    </div>
                  }
                >
                  <PokeInfo encounter={enc} pokemon={foundPokemon} />
                </Popup>
              );
            })
          ) : (
            <Tip missing={t('multi_status')} />
          )}
        </Tab.Pane>
      ),
    },
    {
      menuItem: (
        <Menu.Item key="failed">
          <FailedSVG className={styles.fainted} />
          {t('Failed')}
          <Label>{failedPokemon?.length || 0}</Label>
        </Menu.Item>
      ),
      render: () => (
        <Tab.Pane attached={false} className={`${styles.box} ${styles.sky}`}>
          {failedPokemon?.length > 0 ? (
            failedPokemon?.map((enc, i) => {
              const foundPokemon = POKEMAP.get(enc.pokemon);
              return (
                <Popup
                  key={`failed-${enc.id}-${Number(i) + 1}`}
                  inverted={darkMode}
                  on="click"
                  pinned
                  position="top center"
                  trigger={
                    <div className={styles.pokemon} data-testid={`failed-${enc.id}`}>
                      <PkmImage name={foundPokemon?.text} shiny={enc?.details?.shiny} />
                    </div>
                  }
                >
                  <PokeInfo encounter={enc} pokemon={foundPokemon} />
                </Popup>
              );
            })
          ) : (
            <Tip missing={t('Failed')} />
          )}
        </Tab.Pane>
      ),
    },
    {
      menuItem: (
        <Menu.Item key="fainted">
          <FaintedSVG className={styles.fainted} />
          {t('Fainted')}
          <Label>{faintedPokemon?.length || 0}</Label>
        </Menu.Item>
      ),
      render: () => (
        <Tab.Pane attached={false} className={`${styles.box} ${styles.crag}`}>
          {faintedPokemon?.length > 0 ? (
            faintedPokemon?.map((enc, i) => {
              const foundPokemon = POKEMAP.get(enc.pokemon);
              return (
                <Popup
                  key={`fainted-${enc.id}-${Number(i) + 1}`}
                  inverted={darkMode}
                  on="click"
                  pinned
                  position="top center"
                  trigger={
                    <div className={styles.pokemon} data-testid={`fainted-${enc.id}`}>
                      <PkmImage name={foundPokemon?.text} shiny={enc?.details?.shiny} />
                    </div>
                  }
                >
                  <PokeInfo encounter={enc} pokemon={foundPokemon} />
                </Popup>
              );
            })
          ) : (
            <Tip missing={t('Fainted')} />
          )}
        </Tab.Pane>
      ),
    },
  ];

  return (
    <div className={styles.pokestats}>
      <Tab className={styles.tabs} menu={{ secondary: true }} panes={panes} />
    </div>
  );
}

export default Pokestats;