import { z } from 'zod';

export type ProductFormValues = {
    name: { id: string; en: string };
    slug: { id: string; en: string };
    short_description: { id: string; en: string };
    description: { id: string; en: string };
    flavor_notes: { id: string; en: string };
    product_category_id: string;
    origin: string;
    variety: string;
    fermentation: string;
    grade: string;
    fat_content: string;
    bean_size: string;
    bean_count: string;
    moisture: string;
    defect: string;
    harvest_season: string;
    stock_kg: string;
    moq_kg: string;
    price_tier: string;
    is_active: boolean;
    is_featured: boolean;
    sort_order: number;
};

const translatableField = (max: number) =>
    z.object({
        id: z.string().max(max, `Maksimal ${max} karakter`),
        en: z.string().max(max, `Maksimal ${max} karakter`),
    });

const slugField = (max: number) =>
    z.object({
        id: z
            .string()
            .max(max, `Maksimal ${max} karakter`)
            .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, 'Format slug tidak valid (huruf kecil & tanda hubung)'),
        en: z
            .string()
            .max(max, `Maksimal ${max} karakter`)
            .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, 'Invalid slug format (lowercase & hyphens)'),
    });

export const productSchema = z.object({
    name: translatableField(255).superRefine((value, ctx) => {
        if (!value.id.trim()) {
            ctx.addIssue({ code: 'custom', message: 'Nama (ID) wajib diisi', path: ['id'] });
        }

        if (!value.en.trim()) {
            ctx.addIssue({ code: 'custom', message: 'Name (EN) is required', path: ['en'] });
        }
    }),
    slug: slugField(255).superRefine((value, ctx) => {
        if (!value.id.trim()) {
            ctx.addIssue({ code: 'custom', message: 'Slug (ID) wajib diisi', path: ['id'] });
        }

        if (!value.en.trim()) {
            ctx.addIssue({ code: 'custom', message: 'Slug (EN) is required', path: ['en'] });
        }
    }),
    short_description: translatableField(500),
    description: translatableField(10000),
    flavor_notes: translatableField(500),
    product_category_id: z.string().optional().or(z.literal('')),
    origin: z.string().max(255).optional().or(z.literal('')),
    variety: z.string().max(100).optional().or(z.literal('')),
    fermentation: z.string().max(30).optional().or(z.literal('')),
    grade: z.string().max(100).optional().or(z.literal('')),
    fat_content: z.string().max(10).optional().or(z.literal('')),
    bean_size: z.string().max(100).optional().or(z.literal('')),
    bean_count: z.string().max(50).optional().or(z.literal('')),
    moisture: z.string().max(50).optional().or(z.literal('')),
    defect: z.string().max(50).optional().or(z.literal('')),
    harvest_season: z.string().max(100).optional().or(z.literal('')),
    stock_kg: z.string().max(10).optional().or(z.literal('')),
    moq_kg: z.string().max(10).optional().or(z.literal('')),
    price_tier: z.string().max(100).optional().or(z.literal('')),
    is_active: z.boolean(),
    is_featured: z.boolean(),
    sort_order: z.coerce.number().int().min(0, 'Minimal 0'),
}) as unknown as z.ZodType<ProductFormValues, ProductFormValues>;
