import { range } from "lodash";
import React, { useContext, useState } from "react";
import { buildClassName } from "../../shared/utils/class-util";
import { getTranslations } from "../../shared/utils/localization-util";
import SettingsContext from "../settings-context";
import { ProductRoom } from "../types";
import AgeSelect from "./age-select";
import AmountInput from "./amount-input";
import Icon from "./icon";

interface RoomsProps {
  rooms: ProductRoom[];
  isDisabled: boolean,
  setIsDisabled: (isOpen: boolean) => void;
  onChange: (rooms: ProductRoom[]) => void;
}

const Rooms: React.FC<RoomsProps> = ({
  rooms,
  isDisabled,
  setIsDisabled,
  onChange,
}) => {

  const [isTouched, setIsTouched] = useState<boolean>(false);
  const [currentRooms, setRoomState] = useState<ProductRoom[]>(rooms);

  const {
    language,
  } = useContext(SettingsContext);
  const translations = getTranslations(language);

  const handleCloseClick = () => {
    setIsDisabled(true);
    if (isTouched) onChange(currentRooms);
  }

  return (
    <div className="booking-product__rooms">
      <div className="booking-product__rooms-title">
        <Icon name="ui-user" width={25} height={25} />{translations.PRODUCT.WHO_YOU_TRAVELING_WITH}
      </div>
      <div className="booking-product__rooms__container">
        <div className="booking-product__rooms__wrapper">
          <div className="booking-product__rooms__header">
            <div className="booking-product__rooms__heading">{translations.SHARED.ROOMS}</div>
            <div className="booking-product__rooms__actions">
              <AmountInput
                label={translations.PRODUCT.NUMBER_OF_ROOMS}
                value={currentRooms.length}
                disabled={isDisabled}
                min={1}
                onChange={(value) => {
                  setRoomState(range(0, value).map(
                    (roomIndex) => currentRooms[roomIndex] ?? { adults: 2, children: 0, childAges: [] }
                  ));

                  setIsTouched(true);
                }}
              />
            </div>
          </div>
          <div className="booking-product__rooms-body">
            {currentRooms.map((room, roomIndex) => (
              <div className="booking-product__room" key={roomIndex}>
                <div className="booking-product__room__header">
                  <h3 className="booking-product__room__heading">
                    {translations.SHARED.ROOM + " " + (roomIndex + 1)}
                  </h3>
                  <div className="booking-product__room__actions">
                    <AmountInput
                      label={translations.SHARED.ADULTS}
                      value={room.adults}
                      disabled={isDisabled}
                      min={1}
                      onChange={(value) => {
                        setRoomState(
                          currentRooms.map((room, i) =>
                            i === roomIndex ? { ...room, adults: value } : room
                          )
                        );

                        setIsTouched(true);
                      }}
                    />
                    <AmountInput
                      label={translations.SHARED.CHILDREN}
                      value={room.children}
                      disabled={isDisabled}
                      onChange={(value) => {
                        setRoomState(
                          currentRooms.map((room, i) =>
                            i === roomIndex
                              ? {
                                ...room,
                                children: value,
                                childAges: range(0, value).map(
                                  (childIndex) => room.childAges[childIndex] ?? 0
                                ),
                              }
                              : room
                          )
                        );

                        setIsTouched(true);
                      }}
                    />
                  </div>
                </div>
                {room.children > 0 && (
                  <div className="booking-product__room-children">
                    <label className="booking-product__room-children-label">{translations.PRODUCT.AGE_BY_DEPARTURE_DATE}</label>
                    <div className="booking-product__room-children-ages">
                      {range(0, room.children).map((childIndex) => (
                        <AgeSelect
                          key={childIndex}
                          value={room.childAges[childIndex]}
                          disabled={isDisabled}
                          onChange={(value) => {
                            setRoomState(
                              currentRooms.map((room, selectorRoomIndex) =>
                                roomIndex === selectorRoomIndex
                                  ? {
                                    ...room,
                                    childAges: room.childAges
                                      .map((age, i) => (childIndex === i ? value : age))
                                      .sort((a, b) => b - a),
                                  }
                                  : room
                              )
                            );

                            setIsTouched(true);
                          }}
                        />
                      ))}
                    </div>
                  </div>
                )}
              </div>
            ))}
          </div>
        </div>
        <div className="booking-product__rooms-footer">
          {isDisabled
            ? (
              <button
                type="button"
                className={buildClassName(["cta--secondary", "cta--add"])}
                title={translations.PRODUCT.EDIT}
                onClick={() => {
                  setIsDisabled(false);
                  setIsTouched(false);
                }}
              >
                <span>
                  <Icon name="ui-pencil" width={25} height={25} />
                  {translations.PRODUCT.EDIT}
                </span>
              </button>)
            : (
              <button
                type="button"
                className={buildClassName(["cta", (isTouched ? "cta--secondary" : "cta--secondary"), "cta--add"])}
                title={translations.PRODUCT.APPLY}
                onClick={handleCloseClick}
              >
                <span>
                  <Icon name="ui-check"/>
                  {translations.PRODUCT.APPLY}
                </span>
              </button>
            )}
        </div>
      </div>
    </div >
  );
}

export default Rooms;