import {
  AirlineBookingPackageOption,
  AirportBookingPackageOption,
  BookingAirlineGroup,
  BookingAirportGroup,
  BookingOptionGroup,
  BookingOptionUnit,
  PerUnitPackageOption,
} from "@qite/tide-client/build/types";
import React, { useEffect, useState } from "react";
import { useSelector } from "react-redux";
import { buildClassName } from "../../../shared/utils/class-util";
import { selectDepartureFlight, selectReturnFlight, selectTranslations } from "../booking/selectors";
import OptionBookingAirlineGroup from "./option-booking-airline-group";
import OptionUnitGroup from "./option-unit-group";

interface OptionUnitsCardProps {
  units: BookingOptionUnit[];
  parentIndex?: number;
  onUnitsChange?: (units: BookingOptionUnit[], index?: number) => void;
}

const OptionUnitsCard: React.FC<OptionUnitsCardProps> = ({
  units,
  parentIndex,
  onUnitsChange,
}) => {
  const [toggleStates, setToggleStates] = useState<boolean[]>();
  const translations = useSelector(selectTranslations);
  const departureFlight = useSelector(selectDepartureFlight);
  const returnFlight = useSelector(selectReturnFlight);

  useEffect(() => {
    if (!toggleStates || toggleStates.length !== units.length) {
      setToggleStates(units.map(() => true));
    }
  }, [units, toggleStates, setToggleStates]);

  const getUnitPaxLabel = (unitIndex: number) => {
    return "";
  };

  const onGroupChange = (
    group: BookingOptionGroup<PerUnitPackageOption>,
    unitIndex: number
  ) => {
    const updatedUnits = units.map((u) => {
      return u.index !== unitIndex
        ? u
        : {
          ...u,
          groups: u.groups.map((ug) => {
            return ug.name !== group.name ? ug : group;
          }),
        };
    });

    if (onUnitsChange) onUnitsChange(updatedUnits, parentIndex);
  };

  const getAirlineGroups = (p: BookingOptionUnit) => {
    return p.airlineGroups
      .filter(x => x.flightIds.includes(departureFlight?.entryLineGuid ?? "") || x.flightIds.includes(returnFlight?.entryLineGuid ?? ""));
  }

  const handleOnAirlineGroupChange = (
    group: BookingAirlineGroup<AirlineBookingPackageOption>,
    unitIndex: number
  ) => {
    const updatedPax = units.map((u) => {
      return u.index !== unitIndex
        ? u
        : {
          ...u,
          airlineGroups: u.airlineGroups.map((g) =>
            g.label === group.label ? group : g
          )
        }
    });

    if (onUnitsChange) onUnitsChange(updatedPax, parentIndex);
  };

  const getAirportGroups = (p: BookingOptionUnit) => {
    return p.airportGroups
      .filter(x => x.flightIds.includes(departureFlight?.entryLineGuid ?? "") || x.flightIds.includes(returnFlight?.entryLineGuid ?? ""));
  }

  const handleOnAirportGroupChange = (
    group: BookingAirportGroup<AirportBookingPackageOption>,
    unitIndex: number
  ) => {
    const updatedPax = units.map((u) => {
      return u.index !== unitIndex
        ? u
        : {
          ...u,
          airportGroups: u.airportGroups.map((g) =>
            g.label === group.label ? group : g
          )
        }
    });

    if (onUnitsChange) onUnitsChange(updatedPax, parentIndex);
  };

  return (
    <>
      {units.map((u, i) => (
        <div
          className={buildClassName([
            "booking-card__group",
            toggleStates && toggleStates[i] && "booking-card__group--active",
          ])}
        >
          <div className="booking-card__group-header">
            <h3 className="booking-card__body-heading">
              {translations.OPTIONS_FORM.UNIT_TITLE} {u.index + 1}
            </h3>
            <p>{getUnitPaxLabel(u.index)}</p>
            <div className="booking-card__actions">
              <button
                type="button"
                className="booking-card__toggle"
                onClick={() => {
                  setToggleStates(
                    toggleStates?.map((s, si) => (si == i ? !s : s))
                  );
                }}
              ></button>
            </div>
          </div>
          {toggleStates &&
            toggleStates[i] && (
              <>
                {u.groups.map(
                  (ug) =>
                    ug && (
                      <OptionUnitGroup
                        key={ug.name}
                        unitIndex={u.index}
                        group={ug}
                        firstClassName={"booking-card__group-body"}
                        secondClassName={"booking-card__group-heading"}
                        parentId={`${u.index}_${ug.name}`}
                        onGroupChange={onGroupChange}
                      />
                    )
                )}
                {getAirlineGroups(u).map((group, i) => (
                  <OptionBookingAirlineGroup
                    key={`${group.label}_${i}`}
                    airGroup={group}
                    onGroupChange={(updatedGroup) => {
                      handleOnAirlineGroupChange(updatedGroup, u.index)
                    }} />
                ))}
                {getAirportGroups(u).map((group, i) => (
                  <OptionBookingAirlineGroup
                    key={`${group.label}_${i}`}
                    airGroup={group}
                    onGroupChange={(updatedGroup) => {
                      handleOnAirportGroupChange(updatedGroup, u.index)
                    }} />
                ))}
              </>
            )}
        </div>
      ))}
    </>
  );
};

export default OptionUnitsCard;
