import { z } from 'zod';

export const ProductStatusSchema = z.enum([
  'active',
  'inactive',
  'out_of_stock',
  'discontinued'
]);

export const ProductSchema = z.object({
  id: z.string(),
  name: z.string(),
  sku: z.string(),
  price: z.number().positive(),
  stock: z.number().int().nonnegative(),
  description: z.string().optional(),
  images: z.array(z.string()).optional(),
  categories: z.array(z.string()).optional(),
  attributes: z.record(z.string(), z.unknown()).optional(),
  status: ProductStatusSchema,
  createdAt: z.coerce.date(),
  updatedAt: z.coerce.date()
});

export const CreateProductSchema = z.object({
  name: z.string().min(1).max(200),
  sku: z.string().min(1).max(50),
  price: z.number().positive(),
  stock: z.number().int().nonnegative(),
  description: z.string().optional(),
  images: z.array(z.string()).optional(),
  categories: z.array(z.string()).optional(),
  attributes: z.record(z.string(), z.unknown()).optional(),
  status: ProductStatusSchema.optional().default('active')
});

export const UpdateProductSchema = z.object({
  name: z.string().min(1).max(200).optional(),
  sku: z.string().min(1).max(50).optional(),
  price: z.number().positive().optional(),
  stock: z.number().int().nonnegative().optional(),
  description: z.string().optional(),
  images: z.array(z.string()).optional(),
  categories: z.array(z.string()).optional(),
  attributes: z.record(z.string(), z.unknown()).optional(),
  status: ProductStatusSchema.optional()
});

export const ProductQuerySchema = z.object({
  keyword: z.string().optional(),
  category: z.string().optional(),
  status: ProductStatusSchema.optional(),
  minPrice: z.number().positive().optional(),
  maxPrice: z.number().positive().optional(),
  page: z.coerce.number().int().positive().optional().default(1),
  pageSize: z.coerce.number().int().positive().max(100).optional().default(20)
});

export type Product = z.infer<typeof ProductSchema>;
export type ProductStatus = z.infer<typeof ProductStatusSchema>;
export type CreateProductInput = z.infer<typeof CreateProductSchema>;
export type UpdateProductInput = z.infer<typeof UpdateProductSchema>;
export type ProductQueryInput = z.infer<typeof ProductQuerySchema>;
