import { z } from "zod";

const vehicleColorKeys = [
  "visau-orange",
  "visau-pink",
  "visau-violet",
  "visau-charcoal",
  "visau-indigo",
  "visau-sky",
  "visau-teal",
  "visau-mint",
  "visau-green",
] as const;

const vehicleKinds = ["passenger", "delivery"] as const;

export const createVehicleSchema = z.object({
  body: z.object({
    name: z.string().min(1),
    plateNumber: z.string().trim().optional(),
    colorKey: z.enum(vehicleColorKeys).default("visau-indigo"),
    vehicleKind: z.enum(vehicleKinds).default("passenger"),
    inspectionDueDate: z.string().date().nullable().optional(),
    oilChangeDueDate: z.string().date().nullable().optional(),
    oilChangeOdometer: z.coerce.number().min(0).nullable().optional(),
    oilChangeIntervalKm: z.coerce.number().min(0).nullable().optional(),
    tireChangedAt: z.string().date().nullable().optional(),
    nextTireChangeDueDate: z.string().date().nullable().optional(),
    deviceId: z.string().uuid().optional(),
    userIds: z.array(z.string().uuid()).default([]),
  }),
  query: z.object({}).default({}),
  params: z.object({}).default({}),
});

export const updateVehicleSchema = z.object({
  body: z.object({
    name: z.string().min(1),
    plateNumber: z.string().trim().nullable().optional(),
    colorKey: z.enum(vehicleColorKeys),
    vehicleKind: z.enum(vehicleKinds),
    inspectionDueDate: z.string().date().nullable().optional(),
    oilChangeDueDate: z.string().date().nullable().optional(),
    oilChangeOdometer: z.coerce.number().min(0).nullable().optional(),
    oilChangeIntervalKm: z.coerce.number().min(0).nullable().optional(),
    tireChangedAt: z.string().date().nullable().optional(),
    nextTireChangeDueDate: z.string().date().nullable().optional(),
  }),
  query: z.object({}).default({}),
  params: z.object({
    id: z.string().uuid(),
  }),
});

export const updateVehicleInspectionSchema = z.object({
  body: z.object({
    inspectionDueDate: z.string().date().nullable(),
    oilChangeDueDate: z.string().date().nullable(),
    oilChangeOdometer: z.coerce.number().min(0).nullable(),
    oilChangeIntervalKm: z.coerce.number().min(0).nullable(),
    tireChangedAt: z.string().date().nullable(),
    nextTireChangeDueDate: z.string().date().nullable(),
  }),
  query: z.object({}).default({}),
  params: z.object({
    id: z.string().uuid(),
  }),
});

export const deleteVehicleSchema = z.object({
  body: z.object({}).default({}),
  query: z.object({}).default({}),
  params: z.object({
    id: z.string().uuid(),
  }),
});

export const historyQuerySchema = z.object({
  body: z.object({}).default({}),
  params: z.object({
    id: z.string().uuid(),
  }),
  query: z.object({
    from: z.string().datetime().optional(),
    to: z.string().datetime().optional(),
    limit: z.coerce.number().min(1).max(5000).default(1000),
  }),
});

export const previousPositionQuerySchema = z.object({
  body: z.object({}).default({}),
  params: z.object({
    id: z.string().uuid(),
  }),
  query: z.object({
    before: z.string().datetime(),
  }),
});

export const tripsQuerySchema = z.object({
  body: z.object({}).default({}),
  params: z.object({
    id: z.string().uuid(),
  }),
  query: z.object({
    days: z.coerce.number().int().min(1).max(30).default(14),
    limit: z.coerce.number().int().min(1).max(500).default(200),
    before: z.string().datetime().optional(),
  }),
});
