import { createApi } from "@reduxjs/toolkit/query/react";
import { baseQueryWithAuth } from "@/core/auth-interceptor";

export type ReservationStatus = "new" | "confirmed" | "cancelled" | "completed";

export interface Reservation {
  id: number;
  full_name: string;
  email: string;
  phone: string;
  property: string;
  check_in: string;
  check_out: string;
  guests: number;
  message: string | null;
  status: ReservationStatus;
  notes: string | null;
  created_at: string;
  updated_at: string;
}

export interface CreateReservationRequest {
  full_name: string;
  email: string;
  phone: string;
  property: string;
  check_in: string;
  check_out: string;
  guests: number;
  message?: string;
}

export interface CreateReservationResponse {
  id: number;
  status: ReservationStatus;
  message: string;
}

export interface ListReservationsArgs {
  page?: number;
  limit?: number;
  status?: ReservationStatus;
  q?: string;
}

export interface ListReservationsResponse {
  reservations: Reservation[];
  total: number;
  page: number;
  limit: number;
}

export interface ReservationStats {
  total: number;
  byStatus: Record<ReservationStatus, number>;
}

export interface UpdateReservationArgs {
  id: number;
  status?: ReservationStatus;
  notes?: string | null;
}

export const reservationService = createApi({
  reducerPath: "reservationService",
  baseQuery: baseQueryWithAuth,
  tagTypes: ["Reservation", "ReservationStats"],
  endpoints: (build) => ({
    createReservation: build.mutation<
      CreateReservationResponse,
      CreateReservationRequest
    >({
      query: (body) => ({ url: "/reservations", method: "POST", body }),
      invalidatesTags: ["Reservation", "ReservationStats"],
    }),
    listReservations: build.query<ListReservationsResponse, ListReservationsArgs>({
      query: (args) => ({
        url: "/reservations",
        method: "GET",
        params: {
          page: args.page,
          limit: args.limit,
          status: args.status,
          q: args.q,
        },
      }),
      providesTags: ["Reservation"],
    }),
    reservationStats: build.query<ReservationStats, void>({
      query: () => ({ url: "/reservations/stats", method: "GET" }),
      providesTags: ["ReservationStats"],
    }),
    getReservation: build.query<Reservation, number>({
      query: (id) => ({ url: `/reservations/${id}`, method: "GET" }),
      providesTags: (_res, _err, id) => [{ type: "Reservation", id }],
    }),
    updateReservation: build.mutation<Reservation, UpdateReservationArgs>({
      query: ({ id, ...body }) => ({
        url: `/reservations/${id}`,
        method: "PATCH",
        body,
      }),
      invalidatesTags: ["Reservation", "ReservationStats"],
    }),
    deleteReservation: build.mutation<{ message: string }, number>({
      query: (id) => ({ url: `/reservations/${id}`, method: "DELETE" }),
      invalidatesTags: ["Reservation", "ReservationStats"],
    }),
  }),
});

export const {
  useCreateReservationMutation,
  useListReservationsQuery,
  useReservationStatsQuery,
  useGetReservationQuery,
  useUpdateReservationMutation,
  useDeleteReservationMutation,
} = reservationService;
