package dev.lions.unionflow.server.service.compliance;

import dev.lions.unionflow.server.api.dto.compliance.response.KpiPublicSnapshot;
import dev.lions.unionflow.server.security.AuditTrailService;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import java.time.LocalDateTime;
import java.util.UUID;

/**
 * Service métier KPI public (Sprint 17) — extrait un sous-ensemble safe de
 * {@link ComplianceDashboardService.ComplianceSnapshot} pour diffusion externe.
 *
 * @since 2026-04-25 (Sprint 17)
 */
@ApplicationScoped
public class KpiPublicService {

  @Inject ComplianceDashboardService dashboardService;
  @Inject AuditTrailService auditTrail;

  /**
   * Construit le snapshot public pour une organisation.
   * Audit chaque accès public pour traçabilité (transparency méta).
   */
  public KpiPublicSnapshot snapshotPublic(UUID organisationId, String accessSource) {
    var snap = dashboardService.snapshot(organisationId);

    auditTrail.logSimple("KpiPublicSnapshot", organisationId, "EXPORT",
        "Accès KPI public via " + (accessSource == null ? "token" : accessSource));

    return KpiPublicSnapshot.builder()
        .organisationNom(snap.organisationNom())
        .referentielComptable(snap.referentielComptable() == null ? null
            : snap.referentielComptable().name())
        .scoreGlobal(snap.scoreGlobal())
        .complianceOfficerDesigne(snap.complianceOfficerDesigne())
        .agAnnuelleStatut(snap.agAnnuelle() == null ? null : snap.agAnnuelle().statut())
        .rapportAirmsStatut(snap.rapportAirms() == null ? null : snap.rapportAirms().statut())
        .dirigeantsAvecCmu(snap.dirigeantsAvecCmu())
        .tauxKycAJourPct(snap.tauxKycAJourPct())
        .tauxFormationLbcFtPct(snap.tauxFormationLbcFtPct())
        .couvertureUboPct(snap.couvertureUboPct())
        .commissaireAuxComptesStatut(snap.commissaireAuxComptes() == null ? null
            : snap.commissaireAuxComptes().statut())
        .dateGeneration(LocalDateTime.now())
        .build();
  }
}
