import { z } from "zod";

export const attestationImpotsSchema = z.object({
  cos: z.coerce.number().int().positive(),
  signataireId: z.coerce.number().int().positive(),
});

const requiredText = (label: string, max: number) =>
  z.string().trim().min(1, `${label} est obligatoire`).max(max);

const optionalIsoDate = z.union([
  z.literal(""),
  z.iso.date(),
]);

export const attestationImpotsPdfDataSchema = z.object({
  formuleSoussignataire: requiredText("La formule du signataire", 40),
  signataireNom: requiredText("Le nom du signataire", 150),
  signataireFonction: requiredText("La fonction du signataire", 255),
  titreNomPrenom: requiredText("L'identité du salarié", 255),
  domicilie: requiredText("La formule de domiciliation", 40),
  adresseLigne: requiredText("L'adresse du salarié", 500),
  entreprise: requiredText("L'entreprise", 255),
  typeContrat: requiredText("Le type de contrat", 150),
  dateEmbauche: z.iso.date(),
  dateFinContrat: optionalIsoDate,
  poste: requiredText("Le poste", 255),
  dateDocument: z.iso.date(),
  lieuDocument: requiredText("Le lieu de signature", 150),
  estToujoursDansEffectifs: z.boolean(),
});

export const attestationImpotsPdfSchema = attestationImpotsSchema.extend({
  data: attestationImpotsPdfDataSchema,
});

export const attestationRetraitePdfDataSchema = attestationImpotsPdfDataSchema
  .omit({ dateFinContrat: true, estToujoursDansEffectifs: true })
  .extend({
    dateSortiePrevue: z.iso.date(),
    dateRetraite: z.iso.date(),
  });

export const attestationRetraitePdfSchema = attestationImpotsSchema.extend({
  data: attestationRetraitePdfDataSchema,
});

const attestationCommonDataSchema = attestationImpotsPdfDataSchema.pick({
  formuleSoussignataire: true,
  signataireNom: true,
  signataireFonction: true,
  titreNomPrenom: true,
  domicilie: true,
  adresseLigne: true,
  entreprise: true,
  dateDocument: true,
  lieuDocument: true,
});

export const attestationEmploiPdfDataSchema = attestationCommonDataSchema.extend({
  contratsTexte: requiredText("L'historique des contrats", 5000),
});

export const attestationMutuellePdfDataSchema =
  attestationImpotsPdfDataSchema.extend({
    dateEcheanceMutuelle: optionalIsoDate,
  });

export const attestationProlongationMutuellePdfDataSchema =
  attestationImpotsPdfDataSchema
    .omit({ poste: true, dateFinContrat: true, estToujoursDansEffectifs: true })
    .extend({
      dateSortiePrevue: z.iso.date(),
      dateReprise: z.iso.date(),
    });

export const autorisationPrefecturePdfDataSchema = z.object({
  correspondantNom: requiredText("Le correspondant", 150),
  correspondantFonction: requiredText("La fonction du correspondant", 255),
  entreprise: requiredText("L'entreprise", 255),
  adresseEntreprise: requiredText("L'adresse de l'entreprise", 500),
  telephoneEntreprise: requiredText("Le téléphone de l'entreprise", 50),
  siret: requiredText("Le SIRET", 50),
  urssaf: requiredText("Le numéro URSSAF", 50),
  nomPrenom: requiredText("L'identité du salarié", 255),
  adresseSalarie: requiredText("L'adresse du salarié", 500),
  dateNaissance: z.iso.date(),
  paysNaissance: requiredText("Le pays de naissance", 150),
  nationalite: requiredText("La nationalité", 100),
  numeroSecuriteSociale: requiredText("Le numéro de sécurité sociale", 100),
  titreSejour: requiredText("Le titre de séjour", 150),
  motifSejour: requiredText("Le motif du séjour", 255),
  numeroCarteSejour: requiredText("Le numéro de carte de séjour", 150),
  dateDelivrance: z.iso.date(),
  dateExpiration: z.iso.date(),
  dateDebutContrat: z.iso.date(),
  dureeContrat: requiredText("La durée du contrat", 150),
  typeContrat: requiredText("Le type de contrat", 150),
  poste: requiredText("Le poste", 255),
  heuresHebdomadaires: requiredText("Le nombre d'heures", 50),
  lieuDocument: requiredText("Le lieu de signature", 150),
  dateDocument: z.iso.date(),
});

export const additionalDocumentPdfSchemas = {
  "attestation-emploi": attestationImpotsSchema.extend({
    data: attestationEmploiPdfDataSchema,
  }),
  "attestation-mutuelle": attestationImpotsSchema.extend({
    data: attestationMutuellePdfDataSchema,
  }),
  "attestation-prolongation-mutuelle": attestationImpotsSchema.extend({
    data: attestationProlongationMutuellePdfDataSchema,
  }),
  "autorisation-prefecture": attestationImpotsSchema.extend({
    data: autorisationPrefecturePdfDataSchema,
  }),
} as const;

export type AttestationImpotsInput = z.infer<typeof attestationImpotsSchema>;
export type AttestationImpotsPdfInput = z.infer<
  typeof attestationImpotsPdfSchema
>;
export type AttestationRetraitePdfInput = z.infer<
  typeof attestationRetraitePdfSchema
>;
