import { z } from 'zod/v4';
import { DosageUnit, StrengthUnit } from '../enums/medicine.enums.js';
import { RefillListStatus } from '../enums/refill.enums.js';

export const CreateRefillListItemSchema = z.object({
  medicineId: z.string().min(1),
  medicineName: z.string().min(1),
  quantity: z.number().positive(),
  unit: z.nativeEnum(DosageUnit),
  estimatedPrice: z.number().nonnegative().optional(),
  storeId: z.string().optional(),
  notes: z.string().max(500).trim().optional(),
});

export const CreateRefillListSchema = z.object({
  name: z.string().min(1).max(200).trim(),
  preferredStoreId: z.string().optional(),
  fromAlerts: z.boolean().default(false),
  thresholdDays: z.number().int().min(1).max(365).default(7),
  items: z.array(CreateRefillListItemSchema).optional(),
});

export const UpdateRefillListSchema = z.object({
  name: z.string().min(1).max(200).trim().optional(),
  status: z.nativeEnum(RefillListStatus).optional(),
  preferredStoreId: z.string().optional(),
});

export const UpdateRefillListItemSchema = z.object({
  checked: z.boolean().optional(),
  actualPrice: z.number().nonnegative().optional(),
  storeId: z.string().optional(),
  notes: z.string().max(500).trim().optional(),
});

export const RefillListQuerySchema = z.object({
  status: z.nativeEnum(RefillListStatus).optional(),
  cursor: z.string().optional(),
  limit: z.coerce.number().int().min(1).max(100).default(20),
});

export const RefillAlertQuerySchema = z.object({
  thresholdDays: z.coerce.number().int().min(1).max(365).default(7),
  userId: z.string().optional(),
});

const PriceOptionSchema = z.object({
  price: z.number(),
  pricePerUnit: z.number(),
  storeName: z.string(),
  storeId: z.string(),
  date: z.string(),
});

export const RefillAlertResponseSchema = z.object({
  medicineId: z.string(),
  medicineName: z.string(),
  medicineStrength: z.number(),
  medicineStrengthUnit: z.nativeEnum(StrengthUnit),
  daysUntilEmpty: z.number(),
  dailyConsumption: z.number(),
  currentStock: z.number(),
  pendingOrderStock: z.number().optional(),
  daysUntilEmptyWithOrders: z.number().nullable().optional(),
  suggestedQuantity: z.number(),
  lastKnownPrice: PriceOptionSchema.optional(),
  cheapestOption: PriceOptionSchema.optional(),
});

export const RefillListItemResponseSchema = z.object({
  _id: z.string(),
  medicineId: z.string(),
  medicineName: z.string(),
  quantity: z.number(),
  unit: z.string(),
  estimatedPrice: z.number().optional(),
  actualPrice: z.number().optional(),
  checked: z.boolean(),
  checkedAt: z.string().optional(),
  addedToCabinet: z.boolean(),
  storeId: z.string().optional(),
  notes: z.string().optional(),
});

export const RefillListResponseSchema = z.object({
  _id: z.string(),
  householdId: z.string(),
  name: z.string(),
  items: z.array(RefillListItemResponseSchema),
  status: z.nativeEnum(RefillListStatus),
  preferredStoreId: z.string().optional(),
  totalEstimatedCost: z.number().optional(),
  createdBy: z.string(),
  createdAt: z.string(),
  updatedAt: z.string(),
});

export const RefillListListResponseSchema = z.object({
  data: z.array(RefillListResponseSchema),
  pagination: z.object({
    cursor: z.string().nullable(),
    hasMore: z.boolean(),
  }),
});

export const AddToCabinetResponseSchema = z.object({
  addedCount: z.number(),
  priceRecordsCreated: z.number(),
});

export type CreateRefillListInput = z.infer<typeof CreateRefillListSchema>;
export type UpdateRefillListInput = z.infer<typeof UpdateRefillListSchema>;
export type UpdateRefillListItemInput = z.infer<typeof UpdateRefillListItemSchema>;
export type RefillListQueryInput = z.infer<typeof RefillListQuerySchema>;
export type RefillAlertQueryInput = z.infer<typeof RefillAlertQuerySchema>;
