import { useEffect, useState } from 'react';
import { Stepper } from '../Stepper';
import { Step0, type ValidTeamType } from './Step0';
import { Step1, type ValidTeamSize } from './Step1';
import { Step2 } from './Step2';
import { httpGet } from '../../lib/http';
import { getUrlParams, setUrlParams } from '../../lib/browser';
import { pageProgressMessage } from '../../stores/page';
import type { TeamResourceConfig } from './RoadmapSelector';
import { Step3 } from './Step3';
import { Step4 } from './Step4';
import { useToast } from '../../hooks/use-toast';

export interface TeamDocument {
  _id?: string;
  name: string;
  avatar?: string;
  creatorId: string;
  links: {
    website?: string;
    github?: string;
    linkedIn?: string;
  };
  type: ValidTeamType;
  personalProgressOnly?: boolean;
  canMemberSendInvite: boolean;
  teamSize?: ValidTeamSize;
  createdAt: Date;
  updatedAt: Date;
}

export function CreateTeamForm() {
  // Can't use hook `useParams` because it runs asynchronously
  const { s: queryStepIndex, t: teamId } = getUrlParams();

  const toast = useToast();
  const [team, setTeam] = useState<TeamDocument>();

  const [loadingTeam, setLoadingTeam] = useState(!!teamId && !team?._id);
  const [stepIndex, setStepIndex] = useState(0);

  async function loadTeam(
    teamIdToFetch: string,
    requiredStepIndex: number | string,
  ) {
    const { response, error } = await httpGet<TeamDocument>(
      `${import.meta.env.PUBLIC_API_URL}/v1-get-team/${teamIdToFetch}`,
    );

    if (error || !response) {
      toast.error(error?.message || 'Error loading team');
      window.location.href = '/account';
      return;
    }

    const requiredStepIndexNumber = parseInt(requiredStepIndex as string, 10);
    const completedSteps = Array(requiredStepIndexNumber)
      .fill(1)
      .map((_, counter) => counter);

    setTeam(response);
    setSelectedTeamType(response.type);
    setCompletedSteps(completedSteps);
    setStepIndex(requiredStepIndexNumber);

    await loadTeamResourceConfig(teamIdToFetch);
  }

  const [teamResourceConfig, setTeamResourceConfig] =
    useState<TeamResourceConfig>([]);

  async function loadTeamResourceConfig(teamId: string) {
    const { error, response } = await httpGet<TeamResourceConfig>(
      `${import.meta.env.PUBLIC_API_URL}/v1-get-team-resource-config/${teamId}`,
    );
    if (error || !Array.isArray(response)) {
      console.error(error);
      return;
    }

    setTeamResourceConfig(response);
  }

  useEffect(() => {
    if (!teamId || !queryStepIndex || team) {
      return;
    }

    pageProgressMessage.set('Fetching team');
    setLoadingTeam(true);
    loadTeam(teamId, queryStepIndex).finally(() => {
      setLoadingTeam(false);
      pageProgressMessage.set('');
    });

    // fetch team and move to step
  }, [teamId, queryStepIndex]);

  const [selectedTeamType, setSelectedTeamType] = useState<ValidTeamType>(
    team?.type || 'company',
  );

  const [completedSteps, setCompletedSteps] = useState([0]);
  if (loadingTeam) {
    return null;
  }

  let stepForm = null;
  if (stepIndex === 0) {
    stepForm = (
      <Step0
        team={team}
        selectedTeamType={selectedTeamType}
        setSelectedTeamType={setSelectedTeamType}
        onStepComplete={() => {
          if (team?._id) {
            setUrlParams({ t: team._id, s: '1' });
          }

          setCompletedSteps([0]);
          setStepIndex(1);
        }}
      />
    );
  } else if (stepIndex === 1) {
    stepForm = (
      <Step1
        team={team}
        onBack={() => {
          if (team?._id) {
            setUrlParams({ t: team._id, s: '0' });
          }

          setStepIndex(0);
        }}
        onStepComplete={(team: TeamDocument) => {
          const createdTeamId = team._id!;

          setUrlParams({ t: createdTeamId, s: '2' });

          setCompletedSteps([0, 1]);
          setStepIndex(2);
          setTeam(team);
        }}
        selectedTeamType={selectedTeamType}
      />
    );
  } else if (stepIndex === 2) {
    stepForm = (
      <Step2
        team={team!}
        teamResourceConfig={teamResourceConfig}
        setTeamResourceConfig={setTeamResourceConfig}
        onBack={() => {
          if (team) {
            setUrlParams({ t: team._id!, s: '1' });
          }

          setStepIndex(1);
        }}
        onNext={() => {
          setUrlParams({ t: teamId!, s: '3' });
          setCompletedSteps([0, 1, 2]);
          setStepIndex(3);
        }}
      />
    );
  } else if (stepIndex === 3) {
    stepForm = (
      <Step3
        team={team}
        onBack={() => {
          if (team) {
            setUrlParams({ t: team._id!, s: '2' });
          }

          setStepIndex(2);
        }}
        onNext={() => {
          if (team) {
            setUrlParams({ t: team._id!, s: '4' });
          }

          setCompletedSteps([0, 1, 2, 3]);
          setStepIndex(4);
        }}
      />
    );
  } else if (stepIndex === 4) {
    stepForm = <Step4 team={team!} />;
  }

  return (
    <div className={'mx-auto max-w-[700px] py-1 md:py-6'}>
      <div
        className={
          'mb-3 flex flex-col items-start border-b pb-3 md:mb-8 md:items-center md:border-b-0 md:pb-0'
        }
      >
        <h1 className={'text-xl font-bold md:text-4xl'}>Create Team</h1>
        <p className={'mt-1 text-sm text-gray-500 md:mt-2 md:text-base'}>
          Complete the steps below to create your team
        </p>
      </div>
      <div className="mb-8 mt-8 hidden w-full sm:flex">
        <Stepper
          activeIndex={stepIndex}
          completeSteps={completedSteps}
          steps={[
            { label: 'Type' },
            { label: 'Details' },
            { label: 'Skills' },
            { label: 'Members' },
          ]}
        />
      </div>

      {stepForm}
    </div>
  );
}