import type { WorkshopEvidenceValidationStatus } from "@prisma/client";

type EvidenceValidationInput = {
  fileName: string;
  mimeType: string;
  sizeBytes: number;
};

export type EvidenceValidationResult = {
  status: Extract<WorkshopEvidenceValidationStatus, "APPROVED" | "REJECTED">;
  reason: string;
  confidence: number;
};

function clampConfidence(value: number) {
  return Math.max(0, Math.min(1, Math.round(value * 100) / 100));
}

export function validateWorkshopEvidenceSync(input: EvidenceValidationInput): EvidenceValidationResult {
  if (process.env.TALLERES_VALIDATION_MODE === "error") {
    throw new Error("validation_service_unavailable");
  }

  const fileName = input.fileName.trim().toLowerCase();

  if (input.sizeBytes < 20 * 1024) {
    return {
      status: "REJECTED",
      reason: "La evidencia parece incompleta. Sube un archivo con mayor detalle.",
      confidence: clampConfidence(0.89),
    };
  }

  if (fileName.includes("borrador") || fileName.includes("draft")) {
    return {
      status: "REJECTED",
      reason: "El archivo parece un borrador; se requiere evidencia final del taller aplicado.",
      confidence: clampConfidence(0.82),
    };
  }

  if (input.mimeType === "application/pdf" || input.mimeType.includes("word")) {
    return {
      status: "APPROVED",
      reason: "Documento estructurado validado correctamente.",
      confidence: clampConfidence(0.86),
    };
  }

  if (input.mimeType.startsWith("image/")) {
    return {
      status: "APPROVED",
      reason: "Evidencia visual recibida y compatible con los requisitos del taller.",
      confidence: clampConfidence(0.71),
    };
  }

  return {
    status: "REJECTED",
    reason: "No fue posible validar el tipo de evidencia recibido.",
    confidence: clampConfidence(0.58),
  };
}
