import type { StrategicRecommendationView, MaturityLevelView, GapLevelKey, NextMaturityTarget } from "@/lib/talleres/types";

type RecommendationTemplate = {
  title: string;
  description: string;
};

const MATURITY_LEVELS: MaturityLevelView[] = [
  { key: "inicial", label: "Inicial", minScore: 0, maxScore: 39 },
  { key: "en_desarrollo", label: "En Desarrollo", minScore: 40, maxScore: 59 },
  { key: "preparado", label: "Preparado", minScore: 60, maxScore: 79 },
  { key: "avanzado", label: "Avanzado", minScore: 80, maxScore: 100 },
];

const RISK_BY_MODULE_KEY: Record<string, string> = {
  "liderazgo-vision-estrategica": "Riesgo moderado de perder oportunidades por vision estrategica limitada.",
  "cultura-organizacional": "Riesgo bajo por cultura organizacional orientada a colaboracion y cumplimiento.",
  "estructura-procesos": "Riesgo bajo por estructura interna y procesos con mayor trazabilidad.",
  "innovacion-sostenibilidad": "Riesgo moderado de propuestas poco diferenciadas frente a la competencia.",
  "impacto-social-equidad": "Riesgo moderado por evidencia insuficiente en criterios de impacto social.",
};

const RECOMMENDATION_BY_MODULE_KEY: Record<string, RecommendationTemplate> = {
  "liderazgo-vision-estrategica": {
    title: "Prioriza tu preparacion estrategica",
    description: "Define objetivos trimestrales y evidencia de seguimiento para fortalecer direccion y priorizacion.",
  },
  "cultura-organizacional": {
    title: "Consolida cultura de alto rendimiento",
    description: "Implementa dinamicas colaborativas y acuerdos de comunicacion para sostener productividad.",
  },
  "estructura-procesos": {
    title: "Reduce riesgos de descalificacion",
    description: "Documenta procesos criticos y formaliza controles para cumplir requisitos de licitaciones.",
  },
  "innovacion-sostenibilidad": {
    title: "Diferenciate con innovacion aplicable",
    description: "Estructura iniciativas sostenibles con indicadores claros de impacto operativo y economico.",
  },
  "impacto-social-equidad": {
    title: "Posicionate para competir",
    description: "Fortalece tu narrativa de impacto social con evidencias verificables y metas medibles.",
  },
};

function clamp(min: number, value: number, max: number) {
  return Math.max(min, Math.min(max, value));
}

export function roundScore(score: number) {
  return Math.round(clamp(0, score, 100) * 10) / 10;
}

export function getMaturityLevel(score: number): MaturityLevelView {
  const safeScore = roundScore(score);
  return MATURITY_LEVELS.find((level) => safeScore >= level.minScore && safeScore <= level.maxScore) ?? MATURITY_LEVELS[0];
}

export function getNextMaturityTarget(score: number): NextMaturityTarget {
  const safeScore = roundScore(score);

  if (safeScore >= 80) {
    return null;
  }

  const target = MATURITY_LEVELS.find((level) => level.minScore > safeScore);

  if (!target) {
    return null;
  }

  const pointsNeeded = Math.max(0, Math.ceil(target.minScore - safeScore));
  const base = target.minScore - 20;
  const progressToTarget = Math.round(clamp(0, ((safeScore - base) / 20) * 100, 100));

  return {
    label: target.label,
    threshold: target.minScore,
    pointsNeeded,
    progressToTarget,
  };
}

export function getGapLevel(score: number): GapLevelKey {
  const safeScore = roundScore(score);

  if (safeScore >= 80) {
    return "baja";
  }

  if (safeScore >= 60) {
    return "media";
  }

  return "alta";
}

export function getGapLabel(gapLevel: GapLevelKey) {
  if (gapLevel === "baja") {
    return "Brecha Baja";
  }

  if (gapLevel === "media") {
    return "Brecha Media";
  }

  return "Brecha Alta";
}

export function getRiskMessage(moduleKey: string, score: number) {
  const predefined = RISK_BY_MODULE_KEY[moduleKey];

  if (predefined) {
    return predefined;
  }

  const gapLevel = getGapLevel(score);

  if (gapLevel === "baja") {
    return "Riesgo bajo con condiciones favorables para competir en contratacion publica.";
  }

  if (gapLevel === "media") {
    return "Riesgo moderado por capacidades aun en consolidacion.";
  }

  return "Riesgo alto por brechas criticas que requieren atencion inmediata.";
}

export function computeDimensionDisplayScore(baseScore: number, approvedWorkshopCount: number) {
  const bonus = Math.max(0, approvedWorkshopCount) * 8;
  return roundScore(baseScore + bonus);
}

export function buildStrategicRecommendations(
  dimensions: { moduleKey: string; moduleName: string; displayScore: number; gapLevel: GapLevelKey }[],
): StrategicRecommendationView[] {
  const weighted = [...dimensions].sort((a, b) => {
    const severity = (value: GapLevelKey) => {
      if (value === "alta") {
        return 3;
      }

      if (value === "media") {
        return 2;
      }

      return 1;
    };

    return severity(b.gapLevel) - severity(a.gapLevel) || a.displayScore - b.displayScore;
  });

  return weighted.slice(0, 3).map((dimension, index) => {
    const fallback: RecommendationTemplate = {
      title: `Fortalece ${dimension.moduleName}`,
      description: "Activa talleres, documenta evidencia y establece seguimiento semanal para cerrar brechas.",
    };
    const template = RECOMMENDATION_BY_MODULE_KEY[dimension.moduleKey] ?? fallback;

    return {
      id: `strategic-rec-${index + 1}-${dimension.moduleKey}`,
      title: template.title,
      description: template.description,
      moduleKey: dimension.moduleKey,
      moduleName: dimension.moduleName,
      priority: dimension.gapLevel === "alta" ? "alta" : "media",
    };
  });
}
