import { z } from 'zod';

// Esquemas de validación comunes
export const commonSchemas = {
  // Validación de strings
  string: (min = 1, max = 255) =>
    z.string().min(min, 'Este campo es requerido').max(max, 'Máximo 255 caracteres'),

  // Validación de emails
  email: z.string().email('Por favor ingresa un email válido').min(1, 'Este campo es requerido'),

  // Validación de números
  number: (min = 0, max = Number.MAX_SAFE_INTEGER) =>
    z.number().min(min, 'Debe ser un número positivo').max(max, 'Número demasiado grande'),

  // Validación de fechas
  date: z
    .date()
    .refine(
      (date) => date instanceof Date && !isNaN(date.getTime()),
      'Por favor ingresa una fecha válida'
    ),

  // Validación de booleanos
  boolean: z.boolean(),

  // Validación de arrays
  array: (min = 1, max = 100) =>
    z
      .array(z.unknown())
      .min(min, 'Al menos un elemento requerido')
      .max(max, 'Máximo 100 elementos'),
};

// Función para manejar errores de formulario
export function getFieldError(
  fieldErrors: Record<string, string[]>,
  fieldName: string
): string | undefined {
  const errors = fieldErrors[fieldName];
  return errors?.[0];
}

// Función para manejar errores de formulario global
export function getGlobalError(fieldErrors: Record<string, string[]>): string | undefined {
  const globalErrors = Object.values(fieldErrors).flat();
  return globalErrors?.[0];
}

// Esquemas específicos para la aplicación
export const appSchemas = {
  // Esquema para crear/editar juegos
  gameSchema: z.object({
    title: commonSchemas.string(1, 100),
    description: commonSchemas.string(0, 2000),
    platformId: commonSchemas.number(1, Number.MAX_SAFE_INTEGER),
    releaseYear: commonSchemas.number(1900, new Date().getFullYear() + 5),
    rating: z.number().min(0).max(10).optional(),
    tags: commonSchemas.array(0, 50).optional(),
    romFile: z.string().optional(),
    metadataSource: z.enum(['igdb', 'rawg', 'thegamesdb', 'manual']).optional(),
  }),

  // Esquema para importar ROMs
  importRomSchema: z.object({
    romPath: commonSchemas.string(1, 500),
    platformId: commonSchemas.number(1, Number.MAX_SAFE_INTEGER),
    autoScan: z.boolean().default(true),
  }),

  // Esquema para configuración
  settingsSchema: z.object({
    igdbApiKey: commonSchemas.string(0, 100).optional(),
    rawgApiKey: commonSchemas.string(0, 100).optional(),
    thegamesdbApiKey: commonSchemas.string(0, 100).optional(),
    defaultRomDirectory: commonSchemas.string(0, 500).optional(),
    autoImportEnabled: z.boolean().default(true),
    metadataSourcePriority: z
      .array(z.enum(['igdb', 'rawg', 'thegamesdb']))
      .default(['igdb', 'rawg', 'thegamesdb']),
  }),

  // Esquema para plataformas
  platformSchema: z.object({
    name: commonSchemas.string(1, 50),
    description: commonSchemas.string(0, 500),
    manufacturer: commonSchemas.string(0, 100),
    releaseYear: commonSchemas.number(1900, new Date().getFullYear() + 5),
    romExtension: z.string().optional(),
  }),

  // Esquema para etiquetas
  tagSchema: z.object({
    name: commonSchemas.string(1, 30),
    color: z.string().regex(/^#[0-9A-F]{6}$/i, 'Color inválido. Use formato #RRGGBB'),
    description: commonSchemas.string(0, 200),
  }),
};
