import JsonURL from "@jsonurl/jsonurl";
import { isArray, isNil } from "lodash";
import { FlightInfo, Room } from "../../booking-wizard/types";

export const getDateFromParams = (
  params: URLSearchParams,
  name: string
): string | null => {
  const dateString = params.get(name);

  if (dateString === null) {
    return null;
  }

  const year = parseInt(dateString.slice(0, 5));
  const month = parseInt(dateString.slice(5, 7));
  const date = parseInt(dateString.slice(8, 10));

  return new Date(Date.UTC(year, month - 1, date)).toISOString();
};

export const getDateAsDateFromParams = (
  params: URLSearchParams,
  name: string
): Date | null => {
  const dateString = params.get(name);

  if (dateString === null) {
    return null;
  }

  const year = parseInt(dateString.slice(0, 5));
  const month = parseInt(dateString.slice(5, 7));
  const date = parseInt(dateString.slice(8, 10));

  return new Date(Date.UTC(year, month - 1, date));
};

export const getNumberFromParams = (
  params: URLSearchParams,
  name: string
): number | null => {
  const numberString = params.get(name);

  if (numberString === null) {
    return null;
  }

  return parseInt(numberString);
};

export const getRoomsFromParams = (
  params: URLSearchParams,
  name: string
): Room[] | null => {
  const roomString = params.get(name);

  if (roomString === null) {
    return null;
  }

  // Encode the accommodation code in the room string because (external) acco codes can contain special characters like '='. eg: 'ACNYNEgUzMDc4NBoKMTAzODcwMjk4NQ=='
  const safeRoomsString = roomString.replace(/accommodationCode:([^,]*)/, (match, code) => {
    return `accommodationCode:${encodeURIComponent(code)}`;
  });

  const rooms = JsonURL.parse(safeRoomsString) as Room[] | undefined;

  if (isNil(rooms)) {
    return null;
  }

  return rooms.map((room) => {
    if (!isArray(room.childAges)) room.childAges = [];
    room.children = room.childAges.length ?? 0;
    return room;
  });
};

export const getFlightsFromParams = (
  params: URLSearchParams,
  name: string
): FlightInfo | null => {
  let flightString = params.get(name);

  if (flightString === null) {
    return null;
  }

  flightString = flightString.replace(/ /g, "%20");

  const flightInfo = JsonURL.parse(flightString, { AQF: true }) as
    | FlightInfo
    | undefined;

  if (isNil(flightInfo)) {
    return null;
  }

  return flightInfo;
};

export const getStringFromParams = (
  params: URLSearchParams,
  name: string
): string | null => {
  return params.get(name);
};

export const getNumbersFromParams = (
  params: URLSearchParams,
  name: string
): number[] => {
  const numberStrings = params.getAll(name);
  return numberStrings.map((x) => parseInt(x));
};
