/**
 * Layout Zod Validation Schemas (Frontend)
 * Mirrors backend schemas for client-side validation
 * Inspired by Rackula's schema architecture
 */

import { z } from 'zod';

// =============================================================================
// Constants & Patterns
// =============================================================================

const SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
const HEX_COLOUR_PATTERN = /^#[0-9a-fA-F]{6}$/;

// =============================================================================
// Enums
// =============================================================================

export const PlantCategorySchema = z.enum([
    'VEG',
    'FLOWER',
    'MOTHER',
    'CLONE',
    'SEEDLING',
]);
export type PlantCategory = z.infer<typeof PlantCategorySchema>;

export const SectionSubtypeSchema = z.enum([
    'TABLE',
    'RACK',
    'TRAY',
    'HANGER',
    'FLOOR',
]);
export type SectionSubtype = z.infer<typeof SectionSubtypeSchema>;

// =============================================================================
// Core Schemas
// =============================================================================

export const SlugSchema = z
    .string()
    .min(1, 'Slug is required')
    .max(100)
    .regex(SLUG_PATTERN, 'Invalid slug format');

export const PlantTypeSchema = z.object({
    id: z.string().uuid().optional(),
    slug: SlugSchema,
    name: z.string().min(1).max(100),
    strain: z.string().max(100).optional(),
    category: PlantCategorySchema,
    colour: z.string().regex(HEX_COLOUR_PATTERN),
    growthDays: z.number().int().positive().optional(),
    yieldGrams: z.number().positive().optional(),
    notes: z.string().optional(),
    tags: z.array(z.string()).optional(),
    customFields: z.record(z.string(), z.unknown()).optional(),
    createdAt: z.string().optional(),
    updatedAt: z.string().optional(),
});
export type PlantType = z.infer<typeof PlantTypeSchema>;

export const CreatePlantTypeSchema = PlantTypeSchema.omit({
    id: true,
    slug: true,
    createdAt: true,
    updatedAt: true,
});
export type CreatePlantTypeData = z.infer<typeof CreatePlantTypeSchema>;

export const PlacedPlantSchema = z.object({
    id: z.string().uuid(),
    plantTypeSlug: z.string().min(1),
    row: z.number().int().min(0),
    column: z.number().int().min(0),
    tier: z.number().int().min(1).default(1),
    slot: z.number().int().min(1).default(1),
    name: z.string().optional(),
    colourOverride: z.string().regex(HEX_COLOUR_PATTERN).optional(),
    notes: z.string().optional(),
});
export type PlacedPlant = z.infer<typeof PlacedPlantSchema>;

export const RackSchema = z.object({
    id: z.string().uuid(),
    name: z.string().min(1),
    code: z.string().max(20).optional(),
    subtype: SectionSubtypeSchema.default('RACK'),
    rows: z.number().int().min(1).max(100),
    columns: z.number().int().min(1).max(100),
    tiers: z.number().int().min(1).max(10).default(1),
    spacing: z.number().positive().optional(),
    posX: z.number(),
    posY: z.number(),
    width: z.number().positive(),
    height: z.number().positive(),
    plants: z.array(PlacedPlantSchema).default([]),
});
export type Rack = z.infer<typeof RackSchema>;

// =============================================================================
// Utility Functions
// =============================================================================

export function generateSlug(name: string): string {
    return name
        .toLowerCase()
        .replace(/[^a-z0-9]+/g, '-')
        .replace(/^-+|-+$/g, '')
        .replace(/-+/g, '-');
}

// Color palette for plant types
export const PLANT_TYPE_COLORS = [
    '#10b981', // Emerald
    '#3b82f6', // Blue
    '#8b5cf6', // Violet
    '#f59e0b', // Amber
    '#ef4444', // Red
    '#06b6d4', // Cyan
    '#ec4899', // Pink
    '#84cc16', // Lime
] as const;
