import { z } from 'zod';

import { baseListQuerySchema } from '@/lib/api/list-query';

export const uploadFileSchema = z.object({
  filename: z.string().min(1).max(255),
  clientId: z.string().optional(),
  yachtId: z.string().optional(),
  companyId: z.string().optional(),
  folderId: z.string().uuid().optional(),
  category: z.string().optional(),
  entityType: z.string().optional(),
  entityId: z.string().optional(),
});

export const updateFileSchema = z.object({
  filename: z.string().min(1).max(255).optional(),
  category: z.string().optional(),
});

export const listFilesSchema = baseListQuerySchema
  .extend({
    clientId: z.string().optional(),
    yachtId: z.string().optional(),
    companyId: z.string().optional(),
    category: z.string().optional(),
    folderId: z
      .string()
      .uuid()
      .optional()
      .transform((v) => (v === '' ? null : v)),
    /** Entity-aggregated projection params — mutually exclusive with folderId. */
    entityType: z.enum(['client', 'company', 'yacht']).optional(),
    entityId: z.string().uuid().optional(),
  })
  .refine(
    (q) => !(q.folderId !== undefined && (q.entityType !== undefined || q.entityId !== undefined)),
    {
      message: 'folderId is mutually exclusive with entityType/entityId',
      path: ['folderId'],
    },
  )
  .refine((q) => Boolean(q.entityType) === Boolean(q.entityId), {
    message: 'entityType and entityId must be provided together',
    path: ['entityType'],
  });

export type UploadFileInput = z.infer<typeof uploadFileSchema>;
export type UpdateFileInput = z.infer<typeof updateFileSchema>;
export type ListFilesInput = z.infer<typeof listFilesSchema>;
