import * as z from "zod";
import * as imports from "../zod-utils";
import { BookingStatus } from "@prisma/client";
import {
  CompleteUser,
  UserModel,
  CompleteBookingReference,
  BookingReferenceModel,
  CompleteEventType,
  EventTypeModel,
  CompleteAttendee,
  AttendeeModel,
  CompleteDailyEventReference,
  DailyEventReferenceModel,
  CompletePayment,
  PaymentModel,
  CompleteDestinationCalendar,
  DestinationCalendarModel,
} from "./index";

export const _BookingModel = z.object({
  id: z.number().int(),
  uid: z.string(),
  userId: z.number().int().nullish(),
  eventTypeId: z.number().int().nullish(),
  title: z.string(),
  description: z.string().nullish(),
  startTime: z.date(),
  endTime: z.date(),
  location: z.string().nullish(),
  createdAt: z.date(),
  updatedAt: z.date().nullish(),
  confirmed: z.boolean(),
  rejected: z.boolean(),
  status: z.nativeEnum(BookingStatus),
  paid: z.boolean(),
  cancellationReason: z.string().nullish(),
  rejectionReason: z.string().nullish(),
});

export interface CompleteBooking extends z.infer<typeof _BookingModel> {
  user?: CompleteUser | null;
  references: CompleteBookingReference[];
  eventType?: CompleteEventType | null;
  attendees: CompleteAttendee[];
  dailyRef?: CompleteDailyEventReference | null;
  payment: CompletePayment[];
  destinationCalendar?: CompleteDestinationCalendar | null;
}

/**
 * BookingModel contains all relations on your model in addition to the scalars
 *
 * NOTE: Lazy required in case of potential circular dependencies within schema
 */
export const BookingModel: z.ZodSchema<CompleteBooking> = z.lazy(() =>
  _BookingModel.extend({
    user: UserModel.nullish(),
    references: BookingReferenceModel.array(),
    eventType: EventTypeModel.nullish(),
    attendees: AttendeeModel.array(),
    dailyRef: DailyEventReferenceModel.nullish(),
    payment: PaymentModel.array(),
    destinationCalendar: DestinationCalendarModel.nullish(),
  })
);