import {
  AirlineBookingPackageOption,
  AirportBookingPackageOption,
  BookingAirlineGroup,
  BookingAirportGroup,
  BookingOptionGroup,
  BookingOptionPax,
  BookingPackagePax,
  PerPaxPackageOption,
} 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 {
  selectBookingPackagePax,
  selectDepartureFlight,
  selectReturnFlight,
  selectTranslations,
} from "../booking/selectors";
import { CHILD_MAX_AGE } from "../travelers-form/travelers-form-slice";
import OptionPaxGroup from "./option-pax-group";
import OptionBookingAirlineGroup from "./option-booking-airline-group";

interface OptionPaxCardProps {
  pax: BookingOptionPax[];
  requestRoomsPax?: BookingPackagePax[];
  parentIndex?: number;
  onPaxChange?: (pax: BookingOptionPax[], index?: number) => void;
}

const OptionPaxCard: React.FC<OptionPaxCardProps> = ({
  pax,
  requestRoomsPax,
  parentIndex,
  onPaxChange,
}) => {
  const [toggleStates, setToggleStates] = useState<boolean[]>();
  const translations = useSelector(selectTranslations);
  const departureFlight = useSelector(selectDepartureFlight);
  const returnFlight = useSelector(selectReturnFlight);

  useEffect(() => {
    if (!toggleStates || toggleStates.length !== pax.length) {
      setToggleStates(pax.map(() => true));
    }
  }, [pax, toggleStates, setToggleStates]);

  const bookingPax = useSelector(selectBookingPackagePax);

  const getPaxName = (bookingOptionPax: BookingOptionPax) => {
    const item = bookingPax.find((x) => x.id === bookingOptionPax.id);
    if (!item?.firstName && !item?.lastName) {
      return bookingOptionPax?.paxName;
    }
    return `${item?.firstName} ${item?.lastName}`;
  };

  const onGroupChange = (
    group: BookingOptionGroup<PerPaxPackageOption>,
    paxId: number
  ) => {
    const updatedPax = pax.map((p) => {
      return p.id !== paxId
        ? p
        : {
            ...p,
            groups: p.groups.map((pg) => {
              return pg.name !== group.name ? pg : group;
            }),
          };
    });

    if (onPaxChange) onPaxChange(updatedPax, parentIndex);
  };

  const getAirlineGroups = (p: BookingOptionPax) => {
    return p.airlineGroups.filter(
      (x) =>
        x.flightIds.includes(departureFlight?.entryLineGuid ?? "") ||
        x.flightIds.includes(returnFlight?.entryLineGuid ?? "")
    );
  };

  const handleOnAirlineGroupChange = (
    group: BookingAirlineGroup<AirlineBookingPackageOption>,
    paxId: number
  ) => {
    const updatedPax = pax.map((p) => {
      return p.id !== paxId
        ? p
        : {
            ...p,
            airlineGroups: p.airlineGroups.map((g) =>
              g.label === group.label ? group : g
            ),
          };
    });

    if (onPaxChange) onPaxChange(updatedPax, parentIndex);
  };

  const getAirportGroups = (p: BookingOptionPax) => {
    return p.airportGroups.filter(
      (x) =>
        x.flightIds.includes(departureFlight?.entryLineGuid ?? "") ||
        x.flightIds.includes(returnFlight?.entryLineGuid ?? "")
    );
  };

  const handleOnAirportGroupChange = (
    group: BookingAirportGroup<AirportBookingPackageOption>,
    paxId: number
  ) => {
    const updatedPax = pax.map((p) => {
      return p.id !== paxId
        ? p
        : {
            ...p,
            airportGroups: p.airportGroups.map((g) =>
              g.label === group.label ? group : g
            ),
          };
    });

    if (onPaxChange) onPaxChange(updatedPax, parentIndex);
  };

  return (
    <>
      {pax.map((p, i) => (
        <div
          key={i}
          className={buildClassName([
            "booking-card__group",
            toggleStates && toggleStates[i] && "booking-card__group--active",
          ])}
        >
          <div className="booking-card__group-header">
            <h3 className="booking-card__body-heading">{getPaxName(p)}</h3>
            {requestRoomsPax?.find((x) => x.id == p.id)?.age && (
              <p className="form__region-label">
                {requestRoomsPax.find((x) => x.id == p.id)?.age! > CHILD_MAX_AGE
                  ? translations.TRAVELERS_FORM.ADULT
                  : translations.TRAVELERS_FORM.CHILD}
              </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] && (
            <>
              {p.groups.map(
                (pg) =>
                  pg && (
                    <OptionPaxGroup
                      key={pg.name}
                      paxId={p.id}
                      group={pg}
                      firstClassName={"booking-card__group-body"}
                      secondClassName={"booking-card__group-heading"}
                      parentId={`${p.id}_${pg.name}`}
                      onGroupChange={onGroupChange}
                    />
                  )
              )}
              {getAirlineGroups(p).map((group, i) => (
                <OptionBookingAirlineGroup
                  key={`${group.label}_${i}`}
                  airGroup={group}
                  onGroupChange={(updatedGroup) => {
                    handleOnAirlineGroupChange(updatedGroup, p.id);
                  }}
                />
              ))}
              {getAirportGroups(p).map((group, i) => (
                <OptionBookingAirlineGroup
                  key={`${group.label}_${i}`}
                  airGroup={group}
                  onGroupChange={(updatedGroup) => {
                    handleOnAirportGroupChange(updatedGroup, p.id);
                  }}
                />
              ))}
            </>
          )}
        </div>
      ))}
    </>
  );
};

export default OptionPaxCard;
