import { defineStore } from 'pinia';
import { ref } from 'vue';
import { Boat, useBoatStore } from './boat';
import { date } from 'quasar';
import { DateOptions } from 'quasar';

export interface Reservation {
  id: number;
  user: string;
  start: Date;
  end: Date;
  resource: Boat;
  reservationDate: Date;
  status?: string;
}

function getSampleData(): Reservation[] {
  const sampleData = [
    {
      id: 1,
      user: 'John Smith',
      start: '12:00',
      end: '14:00',
      boat: 1,
      status: 'confirmed',
    },
    {
      id: 2,
      user: 'Bob Barker',
      start: '18:00',
      end: '20:00',
      boat: 1,
      status: 'confirmed',
    },
    {
      id: 3,
      user: 'Peter Parker',
      start: '8:00',
      end: '10:00',
      boat: 2,
      status: 'tentative',
    },
    {
      id: 4,
      user: 'Vince McMahon',
      start: '13:00',
      end: '17:00',
      boat: 2,
      status: 'pending',
    },
    {
      id: 5,
      user: 'Heather Graham',
      start: '06:00',
      end: '09:00',
      boat: 3,
      status: 'confirmed',
    },
    {
      id: 6,
      user: 'Lawrence Fishburne',
      start: '18:00',
      end: '20:00',
      boat: 3,
    },
  ];
  const boatStore = useBoatStore();
  const now = new Date();
  const splitTime = (x: string): string[] => {
    return x.split(':');
  };
  const makeOpts = (x: string[]): DateOptions => {
    return { hour: parseInt(x[0]), minute: parseInt(x[1]) };
  };

  return sampleData.map((entry): Reservation => {
    const boat = <Boat>boatStore.boats.find((b) => b.id == entry.boat);
    return {
      id: entry.id,
      user: entry.user,
      start: date.adjustDate(now, makeOpts(splitTime(entry.start))),
      end: date.adjustDate(now, makeOpts(splitTime(entry.end))),
      resource: boat,
      reservationDate: now,
      status: entry.status,
    };
  });
}

export const useScheduleStore = defineStore('schedule', () => {
  const reservations = ref<Reservation[]>(getSampleData());
  const getBoatReservations = (
    boat: number | string,
    curDate: Date
  ): Reservation[] => {
    return reservations.value.filter((x) => {
      return (
        (x.start.getDate() == curDate.getDate() ||
          x.end.getDate() == curDate.getDate()) &&
        x.resource != undefined &&
        (typeof boat == 'number'
          ? x.resource.id == boat
          : x.resource.name == boat)
      );
    });
  };

  const isOverlapped = (res: Reservation) => {
    const lapped = reservations.value.filter(
      (entry: Reservation) =>
        entry.id != res.id &&
        entry.resource == res.resource &&
        ((entry.start <= res.start && entry.end > res.start) ||
          (entry.end >= res.end && entry.start <= res.end))
    );
    return lapped.length > 0;
  };

  const getNewId = () => {
    // Trivial placeholder
    return Math.max(...reservations.value.map((item) => item.id)) + 1;
  };

  const addOrCreateReservation = (reservation: Reservation) => {
    const index = reservations.value.findIndex(
      (res) => res.id == reservation.id
    );
    index != -1
      ? (reservations.value[index] = reservation)
      : reservations.value.push(reservation);
  };

  return {
    reservations,
    getBoatReservations,
    getNewId,
    addOrCreateReservation,
    isOverlapped,
  };
});
