package fr.titionfire.ffsaf.rest.from;

import fr.titionfire.ffsaf.data.model.AffiliationRequestModel;
import fr.titionfire.ffsaf.utils.RoleAsso;
import jakarta.ws.rs.FormParam;
import jakarta.ws.rs.core.MediaType;
import lombok.Getter;
import lombok.ToString;
import org.eclipse.microprofile.openapi.annotations.enums.SchemaType;
import org.eclipse.microprofile.openapi.annotations.media.Schema;
import org.jboss.resteasy.reactive.PartType;
import org.jboss.resteasy.reactive.multipart.FileUpload;

@Getter
@ToString(exclude = {"status", "logo"})
public class AffiliationRequestForm {
    @Schema(description = "L'identifiant de l'affiliation. (null si nouvelle demande d'affiliation)")
    @FormParam("id")
    private Long id = null;

    @Schema(description = "Le nom de l'association.", examples = "Association sportive", required = true)
    @FormParam("name")
    private String name = null;

    @Schema(description = "Le numéro SIRET/RNA de l'association.", examples = "12345678901234", required = true)
    @FormParam("state_id")
    private String state_id = null;

    @Schema(description = "L'adresse de l'association.", examples = "1 rue de l'exemple, 75000 Paris", required = true)
    @FormParam("adresse")
    private String adresse = null;

    @Schema(description = "Email de contact de l'association", examples = "test@test.fr")
    @FormParam("contact")
    private String contact = null;

    @Schema(description = "La saison de l'affiliation.", examples = "2025", required = true)
    @FormParam("saison")
    private int saison = -1;

    @Schema(description = "Le statut de l'association.", type = SchemaType.ARRAY)
    @FormParam("status")
    @PartType(MediaType.APPLICATION_OCTET_STREAM)
    private FileUpload status = null;

    @Schema(description = "Le logo de l'association.", type = SchemaType.ARRAY)
    @FormParam("logo")
    @PartType(MediaType.APPLICATION_OCTET_STREAM)
    private FileUpload logo = null;

    @Schema(description = "Le nom du premier membre de l'association.", examples = "Doe", required = true)
    @FormParam("m1_nom")
    private String m1_lname = null;

    @Schema(description = "Le prénom du premier membre de l'association.", examples = "John", required = true)
    @FormParam("m1_prenom")
    private String m1_fname = null;

    @Schema(description = "L'adresse e-mail du premier membre de l'association.", examples = "john.doe@test.com", required = true)
    @FormParam("m1_mail")
    private String m1_email = null;

    @Schema(description = "Le numéro de licence du premier membre de l'association. (null si non licencié)", examples = "12345")
    @FormParam("m1_licence")
    private String m1_lincence = null;

    @Schema(description = "Le rôle du premier membre de l'association. (doit être PRESIDENT)", examples = "PRESIDENT", required = true)
    @FormParam("m1_role")
    private RoleAsso m1_role = null;

    @Schema(description = "Le nom du deuxième membre de l'association.", examples = "Xavier", required = true)
    @FormParam("m2_nom")
    private String m2_lname = null;

    @Schema(description = "Le prénom du deuxième membre de l'association.", examples = "Login", required = true)
    @FormParam("m2_prenom")
    private String m2_fname = null;

    @Schema(description = "L'adresse e-mail du deuxième membre de l'association.", examples = "xavier.login@test.com", required = true)
    @FormParam("m2_mail")
    private String m2_email = null;

    @Schema(description = "Le numéro de licence du deuxième membre de l'association. (null si non licencié)", examples = "04242")
    @FormParam("m2_licence")
    private String m2_lincence = null;

    @Schema(description = "Le rôle du deuxième membre de l'association.", examples = "SECRETAIRE", required = true)
    @FormParam("m2_role")
    private RoleAsso m2_role = null;

    @Schema(description = "Le nom du troisième membre de l'association.", examples = "Doe2", required = true)
    @FormParam("m3_nom")
    private String m3_lname = null;

    @Schema(description = "Le prénom du troisième membre de l'association.", examples = "John2", required = true)
    @FormParam("m3_prenom")
    private String m3_fname = null;

    @Schema(description = "L'adresse e-mail du troisième membre de l'association.", examples = "john.doe22@test.com", required = true)
    @FormParam("m3_mail")
    private String m3_email = null;

    @Schema(description = "Le numéro de licence du troisième membre de l'association. (null si non licencié)")
    @FormParam("m3_licence")
    private String m3_lincence = null;

    @Schema(description = "Le rôle du troisième membre de l'association.", examples = "MEMBREBUREAU", required = true)
    @FormParam("m3_role")
    private RoleAsso m3_role = null;

    public AffiliationRequestModel toModel() {
        AffiliationRequestModel model = new AffiliationRequestModel();
        model.setName(this.getName());
        model.setState_id(this.getState_id());
        model.setAddress(this.getAdresse());
        model.setSaison(this.getSaison());
        model.setContact(this.getContact());

        model.setM1_lname(this.getM1_lname());
        model.setM1_fname(this.getM1_fname());
        model.setM1_email(this.getM1_email());
        model.setM1_lincence((this.getM1_lincence() == null || this.getM1_lincence().isBlank())
                ? -1 : Integer.parseInt(this.getM1_lincence()));
        model.setM1_role(this.getM1_role());

        model.setM2_lname(this.getM2_lname());
        model.setM2_fname(this.getM2_fname());
        model.setM2_email(this.getM2_email());
        model.setM2_lincence((this.getM2_lincence() == null || this.getM2_lincence().isBlank())
                ? -1 : Integer.parseInt(this.getM2_lincence()));
        model.setM2_role(this.getM2_role());

        model.setM3_lname(this.getM3_lname());
        model.setM3_fname(this.getM3_fname());
        model.setM3_email(this.getM3_email());
        model.setM3_lincence((this.getM3_lincence() == null || this.getM3_lincence().isBlank())
                ? -1 : Integer.parseInt(this.getM3_lincence()));
        model.setM3_role(this.getM3_role());

        return model;
    }
}
