import { z } from 'zod';
import type { Dayjs } from 'dayjs';
import type { UploadResult } from '@/components/ui/uploader';

const isDayjs = (v: unknown): v is Dayjs =>
  !!v && typeof v === 'object' && typeof (v as Dayjs).toISOString === 'function';

// Backs AdminApplyDrawer — only the fields that are *always* required regardless of which job
// is selected. The resume/education/experience/skills sections are conditionally required based
// on the selected job's `required_application_fields`, which isn't knowable statically — that
// validation happens at submit time (see AdminApplyDrawer's validateSectionFields).
export const adminApplySchema = z.object({
  user_id: z.string().optional(),
  job_id: z.string().min(1, 'Please select a job'),
  locationAddress: z.string().min(1, 'Location address is required'),
  latitude: z.number({ required_error: 'Latitude is required', invalid_type_error: 'Enter a valid latitude (-90 to 90)' }).min(-90).max(90),
  longitude: z.number({ required_error: 'Longitude is required', invalid_type_error: 'Enter a valid longitude (-180 to 180)' }).min(-180).max(180),
  available_from: z.custom<Dayjs>(isDayjs).optional(),
  resume_upload: z.custom<UploadResult>().nullable().optional(),
  educationLevel: z.string().optional(),
  instituteName: z.string().optional(),
  fieldOfStudy: z.string().optional(),
  previousCompany: z.string().optional(),
  designation: z.string().optional(),
  totalExperience: z.number().optional(),
  primarySkills: z.array(z.string()).optional(),
  certifications_upload: z.array(z.custom<UploadResult>()).optional(),
});
export type AdminApplyFormData = z.infer<typeof adminApplySchema>;

// Notes are required on every transition — the backend permanently records every status change
// with its note in ApplicationStatusLog, so there's always a real record of why, not just a
// blind status flip. Matches the backend's own zod validation (application.validator.ts).
export const updateStatusSchema = z.object({
  status: z.string().min(1, 'Status is required'),
  notes: z.string().min(5, 'Notes are required — at least 5 characters').max(2000),
});
export type UpdateStatusFormData = z.infer<typeof updateStatusSchema>;
