import { z } from "zod";

export const createItemSchema = z.object({
	name: z.string().min(1, "Name is required"),
	weightGrams: z.number().nonnegative().optional(),
	priceCents: z.number().int().nonnegative().optional(),
	categoryId: z.number().int().positive(),
	notes: z.string().optional(),
	productUrl: z.string().url().optional().or(z.literal("")),
	imageFilename: z.string().optional(),
	imageSourceUrl: z.string().url().optional().or(z.literal("")),
	quantity: z.number().int().positive().optional(),
	globalItemId: z.number().int().positive().optional(),
	purchasePriceCents: z.number().int().nonnegative().optional(),
});

export const updateItemSchema = createItemSchema.partial().extend({
	id: z.number().int().positive(),
});

export const createCategorySchema = z.object({
	name: z.string().min(1, "Category name is required"),
	icon: z.string().min(1).max(50).default("package"),
});

export const updateCategorySchema = z.object({
	id: z.number().int().positive(),
	name: z.string().min(1).optional(),
	icon: z.string().min(1).max(50).optional(),
});

// Thread schemas
export const createThreadSchema = z.object({
	name: z.string().min(1, "Thread name is required"),
	categoryId: z.number().int().positive(),
});

export const updateThreadSchema = z.object({
	name: z.string().min(1).optional(),
	categoryId: z.number().int().positive().optional(),
});

// Candidate status
export const candidateStatusSchema = z.enum([
	"researching",
	"ordered",
	"arrived",
]);

// Candidate schemas (same fields as items)
export const createCandidateSchema = z.object({
	name: z.string().min(1, "Name is required"),
	weightGrams: z.number().nonnegative().optional(),
	priceCents: z.number().int().nonnegative().optional(),
	categoryId: z.number().int().positive(),
	notes: z.string().optional(),
	productUrl: z.string().url().optional().or(z.literal("")),
	imageFilename: z.string().optional(),
	imageSourceUrl: z.string().url().optional().or(z.literal("")),
	status: candidateStatusSchema.optional(),
	pros: z.string().optional(),
	cons: z.string().optional(),
	globalItemId: z.number().int().positive().optional(),
});

export const updateCandidateSchema = createCandidateSchema.partial();

export const resolveThreadSchema = z.object({
	candidateId: z.number().int().positive(),
});

export const reorderCandidatesSchema = z.object({
	orderedIds: z.array(z.number().int().positive()).min(1),
});

// Setup schemas
export const createSetupSchema = z.object({
	name: z.string().min(1, "Setup name is required"),
	isPublic: z.boolean().optional().default(false),
});

export const updateSetupSchema = z.object({
	name: z.string().min(1, "Setup name is required"),
	isPublic: z.boolean().optional(),
});

export const syncSetupItemsSchema = z.object({
	itemIds: z.array(z.number().int().positive()),
});

// Classification schemas
export const classificationSchema = z.enum(["base", "worn", "consumable"]);

export const updateClassificationSchema = z.object({
	classification: classificationSchema,
});

// Global item schemas
export const searchGlobalItemsSchema = z.object({
	q: z.string().optional(),
	tags: z.string().optional(),
});

// Profile schemas
export const updateProfileSchema = z.object({
	displayName: z.string().max(100).optional(),
	avatarUrl: z.string().optional(),
	bio: z.string().max(500).optional(),
});
