package dev.lions.user.manager.dto.importexport;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.eclipse.microprofile.openapi.annotations.media.Schema;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * DTO représentant le résultat d'un import CSV d'utilisateurs
 * Contient les statistiques et le détail des erreurs rencontrées
 *
 * @author Lions Development Team
 * @version 1.0.0
 * @since 2026-01-02
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@Schema(description = "Résultat d'un import CSV d'utilisateurs")
public class ImportResultDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    @Schema(description = "Nombre total de lignes traitées", example = "100")
    private int totalLines;

    @Schema(description = "Nombre d'utilisateurs créés avec succès", example = "95")
    private int successCount;

    @Schema(description = "Nombre d'erreurs rencontrées", example = "5")
    private int errorCount;

    @Schema(description = "Message de statut global", example = "Import terminé: 95 utilisateurs créés, 5 erreurs")
    private String message;

    @Schema(description = "Liste des erreurs détaillées")
    @Builder.Default
    private List<ImportErrorDTO> errors = new ArrayList<>();

    /**
     * Ajoute une erreur au rapport
     */
    public void addError(ImportErrorDTO error) {
        if (errors == null) {
            errors = new ArrayList<>();
        }
        errors.add(error);
        errorCount = errors.size();
    }

    /**
     * Génère le message de statut
     */
    public void generateMessage() {
        if (errorCount == 0) {
            message = String.format("✅ Import réussi: %d utilisateur(s) créé(s)", successCount);
        } else {
            message = String.format("⚠️ Import terminé avec erreurs: %d utilisateur(s) créé(s), %d erreur(s)",
                successCount, errorCount);
        }
    }

    /**
     * DTO représentant une erreur d'import sur une ligne
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @Schema(description = "Détail d'une erreur d'import")
    public static class ImportErrorDTO implements Serializable {

        private static final long serialVersionUID = 1L;

        @Schema(description = "Numéro de ligne (1-indexed)", example = "42")
        private int lineNumber;

        @Schema(description = "Contenu de la ligne en erreur", example = "john.doe,invalid-email,John,Doe,true")
        private String lineContent;

        @Schema(description = "Type d'erreur", example = "VALIDATION_ERROR")
        private ErrorType errorType;

        @Schema(description = "Champ concerné par l'erreur", example = "email")
        private String field;

        @Schema(description = "Message d'erreur descriptif", example = "Format d'email invalide")
        private String message;

        @Schema(description = "Détails techniques de l'erreur")
        private String details;
    }

    /**
     * Types d'erreurs possibles lors de l'import
     */
    @Schema(description = "Type d'erreur d'import")
    public enum ErrorType {
        @Schema(description = "Ligne mal formée ou nombre de colonnes incorrect")
        INVALID_FORMAT,

        @Schema(description = "Erreur de validation des données")
        VALIDATION_ERROR,

        @Schema(description = "Utilisateur déjà existant")
        DUPLICATE_USER,

        @Schema(description = "Erreur lors de la création de l'utilisateur")
        CREATION_ERROR,

        @Schema(description = "Erreur interne du système")
        SYSTEM_ERROR
    }
}
