import type { ApplicationFormState } from "@/components/applicant/initiativeFormTypes";
import type { EvidenceBundle, EvidenceItemMeta } from "@/lib/applicationEvidenceApi";

/**
 * Trạng thái minh chứng bắt buộc theo phân loại Đơn — cùng từ vựng Đạt / Không đạt / Chưa xem như thẩm định từng dòng trên kho
 * ({@link ApplicationEvidenceDashboard}, {@link patchEvidenceReview}).
 */
export type RequiredSlotEvidenceStatusLabel =
  | "Đạt"
  | "Không đạt"
  | "Chưa xem"
  | "Chưa có tệp trên kho"
  | "Chưa xác định loại minh chứng"
  | "Đang tải trạng thái kho…"
  | "Chưa tải được kho";

export type CouncilRankRecommendation = {
  rank: string;
  detail: string;
  evidencePathLabel: string;
  /** Trạng thái thẩm định kho cho đúng một loại minh chứng bắt buộc (theo phân loại). */
  requiredSlotEvidenceStatusLabel: RequiredSlotEvidenceStatusLabel;
};

export type StaffBundleEvidenceQueryPhase = "loading" | "error" | "ready";

/** Ánh xạ `reviewStatus` API → nhãn hiển thị đồng bộ với bảng kho. */
export function evidenceItemReviewLabel(meta: EvidenceItemMeta | null | undefined): RequiredSlotEvidenceStatusLabel {
  if (!meta || !String(meta.storageKey ?? "").trim()) {
    return "Chưa có tệp trên kho";
  }
  const rs = meta.reviewStatus;
  if (rs === "approved") return "Đạt";
  if (rs === "rejected") return "Không đạt";
  return "Chưa xem";
}

function requiredSlotStatusForClassification(
  classification: ApplicationFormState["initiativeClassification"] | null,
  bundle: EvidenceBundle | null,
  evidencePhase: StaffBundleEvidenceQueryPhase,
): RequiredSlotEvidenceStatusLabel {
  if (!classification) return "Chưa xác định loại minh chứng";
  if (evidencePhase === "loading") return "Đang tải trạng thái kho…";
  if (evidencePhase === "error") return "Chưa tải được kho";
  const { slot } = evidenceLabelForClassification(classification);
  if (!slot) return "Chưa xác định loại minh chứng";
  return evidenceItemReviewLabel(bundle?.[slot] ?? null);
}

function evidenceLabelForClassification(
  c: ApplicationFormState["initiativeClassification"],
): { path: string; slot: keyof EvidenceBundle | null } {
  if (c === "research") return { path: "Nhóm 2.1 — minh chứng nghiên cứu (tạp chí / hội nghị)", slot: "research" };
  if (c === "textbook") return { path: "Nhóm 2.2 — minh chứng sách / giáo trình", slot: "textbook" };
  if (c === "technical") return { path: "Nhóm 1 — minh chứng áp dụng kỹ thuật / đơn vị", slot: "technical" };
  return { path: "Phân loại Đơn", slot: null };
}

/**
 * Gợi ý hạng xét duyệt dựa trên phân loại trên Đơn và tệp đã có trên kho minh chứng.
 *
 * @param evidencePhase Khi `loading`, không kết luận « thiếu tệp »; khi `ready`, đối chiếu `bundle`.
 */
export function recommendCouncilRankFromEvidence(input: {
  application: Partial<ApplicationFormState>;
  bundle: EvidenceBundle | null;
  evidencePhase?: StaffBundleEvidenceQueryPhase;
}): CouncilRankRecommendation {
  const evidencePhase = input.evidencePhase ?? "ready";
  const classification = input.application.initiativeClassification ?? null;
  const { path, slot } = classification
    ? evidenceLabelForClassification(classification)
    : { path: "Phân loại Đơn", slot: null as keyof EvidenceBundle | null };
  const meta = slot && input.bundle && evidencePhase === "ready" ? input.bundle[slot] : null;
  const hasFile = Boolean(meta?.storageKey);
  const requiredSlotEvidenceStatusLabel = requiredSlotStatusForClassification(
    classification,
    input.bundle,
    evidencePhase,
  );

  if (!classification) {
    return {
      rank: "Chưa xác định",
      detail: "Đơn chưa có phân loại sáng kiến — cần đối chiếu tab Đơn trước khi ghi nhận hạng gợi ý.",
      evidencePathLabel: path,
      requiredSlotEvidenceStatusLabel,
    };
  }

  if (classification === "technical") {
    return {
      rank: hasFile ? "Nhóm 01 — Tốt (đủ minh chứng kho)" : "Nhóm 01 — cần đối chiếu",
      detail: hasFile
        ? "Phân loại Nhóm 1 và đã có minh chứng trên kho — có thể xét theo quy định Nhóm 01."
        : "Phân loại Nhóm 1 nhưng chưa thấy tệp minh chứng trên kho — nên mở kho minh chứng trước khi duyệt.",
      evidencePathLabel: path,
      requiredSlotEvidenceStatusLabel,
    };
  }

  if (classification === "research" || classification === "textbook") {
    const rek = input.application.researchEvidenceKind;
    const tek = input.application.textbookEvidenceKind;
    const excellentHintResearch = classification === "research" && rek === "international" && hasFile;
    const excellentHintTextbook = classification === "textbook" && tek === "book" && hasFile;
    const excellentHint = excellentHintResearch || excellentHintTextbook;
    const mediumHint = classification === "research" && rek === "poster-without-review" && hasFile;
    return {
      rank: excellentHint
        ? "Nhóm 2 — Xuất sắc (gợi ý)"
        : mediumHint
          ? "Nhóm 2 — Trung bình (gợi ý)"
          : "Nhóm 2 — Tốt (gợi ý)",
      detail: excellentHintResearch
        ? "Nhóm 2.1 với bài báo quốc tế và minh chứng trên kho — đủ điều kiện gợi ý xét Xuất sắc theo hướng dẫn nội bộ."
        : excellentHintTextbook
          ? "Nhóm 2.2 — Xuất sắc / Sách, giáo trình với minh chứng trên kho — đủ điều kiện gợi ý xét Xuất sắc theo hướng dẫn nội bộ."
          : mediumHint
            ? "Nhóm 2.1.4 (poster / hội nghị không phản biện) với minh chứng trên kho — gợi ý mức Trung bình theo Đơn."
            : hasFile
              ? "Đã có minh chứng trên kho — đối chiếu nội dung tệp với Đơn trước khi chốt hạng."
              : "Chưa có minh chứng trên kho — cần bổ sung hoặc đối chiếu trước khi duyệt.",
      evidencePathLabel: path,
      requiredSlotEvidenceStatusLabel,
    };
  }

  return {
    rank: "Khác",
    detail: "Không phân loại được tự động — xem tab Đơn và kho minh chứng.",
    evidencePathLabel: path,
    requiredSlotEvidenceStatusLabel,
  };
}
