import { useMemo, useState } from "react";
import { useQuery } from "@tanstack/react-query";
import { Loader2 } from "lucide-react";
import { toast } from "sonner";
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
import { Badge } from "@/components/ui/badge";
import { AdminDocxTemplatePreview } from "@/components/admin/review/AdminDocxTemplatePreview";
import { AdminApproveReviewDialog } from "@/components/admin/review/AdminApproveReviewDialog";
import { AdminRejectReviewDialog } from "@/components/admin/review/AdminRejectReviewDialog";
import {
  collectDocxTemplateCompletenessGaps,
  mergeApplicationTabForReview,
} from "@/components/admin/review/docxTemplateCompleteness";
import {
  recommendCouncilRankFromEvidence,
  type StaffBundleEvidenceQueryPhase,
} from "@/components/admin/review/evaluationCategoryRecommendation";
import { saveCouncilReviewOutcome } from "@/components/admin/review/reviewOutcomeStorage";
import type { ReviewDraftTabs } from "@/components/admin/review/buildInitiativeDraftFromReviewTabs";
import { buildInitiativeDraftFromReviewTabs } from "@/components/admin/review/buildInitiativeDraftFromReviewTabs";
import { reviveContributionDraft } from "@/components/applicant/applicationDrafts";
import type { ContributionDraftShape } from "@/components/applicant/initiative-draft/contributionDraftTypes";
import { getApplicationEvidence } from "@/lib/applicationEvidenceApi";
import { useCouncilEvaluationSnapshotReader } from "@/components/admin/review/councilEvaluationSnapshotContext";

function validateSnapshotForReject(s: ReturnType<typeof useCouncilEvaluationSnapshotReader>): boolean {
  if (!s) {
    toast.error("Chưa tải được dữ liệu Phiếu đánh giá. Mở tab Phiếu Đánh Giá và điền tên sáng kiến, tác giả.");
    return false;
  }
  if (!s.initiativeName.trim()) {
    toast.error("Vui lòng nhập tên sáng kiến ở tab Phiếu Đánh Giá.");
    return false;
  }
  if (!s.authorName.trim()) {
    toast.error("Vui lòng nhập tên tác giả ở tab Phiếu Đánh Giá.");
    return false;
  }
  return true;
}

function validateSnapshotForApprove(s: ReturnType<typeof useCouncilEvaluationSnapshotReader>): boolean {
  if (!validateSnapshotForReject(s)) return false;
  if (!s!.noveltyLevel) {
    toast.error("Vui lòng chọn mức độ tính mới ở tab Phiếu Đánh Giá.");
    return false;
  }
  if (!s!.effectivenessLevel) {
    toast.error("Vui lòng chọn mức độ tính hiệu quả ở tab Phiếu Đánh Giá.");
    return false;
  }
  return true;
}

function evidenceSlotLabel(kind: "research" | "textbook" | "technical"): string {
  if (kind === "research") return "2.1 Nghiên cứu";
  if (kind === "textbook") return "2.2 Sách / GT";
  return "Kỹ thuật";
}

const AUTO_REJECT_EMPTY_VAULT_EVIDENCE =
  "Hệ thống: từ chối tự động — minh chứng bắt buộc theo phân loại Đơn chưa có tệp trên kho.";

export type StaffApplicationBundleReviewTabProps = {
  caseId: string;
  applicationId: string;
  draftTabs: ReviewDraftTabs | undefined;
  /** Hội đồng: hiển thị Từ chối / Duyệt và hộp thoại lưu kết quả. Quản trị: chỉ xem DOCX + kho MinIO. */
  enableCouncilReviewActions: boolean;
  onCouncilApprove?: () => void | Promise<void>;
  onCouncilReject?: () => void | Promise<void>;
};

/**
 * Tab sau « Xác nhận tỷ lệ đóng góp »: xem trước mẫu DOCX từ JSON đã lưu (Postgres qua `loadApplicantDraftBundle`),
 * trạng thái minh chứng trên kho (API → presigned MinIO), và (Hội đồng) Duyệt / Từ chối.
 */
export function StaffApplicationBundleReviewTab({
  caseId,
  applicationId,
  draftTabs,
  enableCouncilReviewActions,
  onCouncilApprove,
  onCouncilReject,
}: StaffApplicationBundleReviewTabProps) {
  const evaluationSnapshot = useCouncilEvaluationSnapshotReader();
  const [approveOpen, setApproveOpen] = useState(false);
  const [rejectOpen, setRejectOpen] = useState(false);

  const evidenceQuery = useQuery({
    queryKey: ["staff-bundle-review-evidence", caseId],
    queryFn: () => getApplicationEvidence(caseId),
    enabled: Boolean(caseId?.trim()),
    staleTime: 20_000,
  });

  const docxCompletenessGaps = useMemo(
    () => collectDocxTemplateCompletenessGaps(draftTabs, evidenceQuery.data ?? null),
    [draftTabs, evidenceQuery.data],
  );

  const evidencePhase: StaffBundleEvidenceQueryPhase = !caseId?.trim()
    ? "error"
    : evidenceQuery.isError
      ? "error"
      : evidenceQuery.isSuccess
        ? "ready"
        : "loading";

  const councilRankRecommendation = useMemo(
    () =>
      recommendCouncilRankFromEvidence({
        application: mergeApplicationTabForReview(draftTabs),
        bundle: evidenceQuery.data ?? null,
        evidencePhase,
      }),
    [draftTabs, evidenceQuery.data, evidencePhase],
  );

  const previewDraft = useMemo(
    () => (caseId.trim() ? buildInitiativeDraftFromReviewTabs(caseId, draftTabs) : null),
    [caseId, draftTabs],
  );

  const previewContribution = useMemo((): ContributionDraftShape => {
    return (reviveContributionDraft(draftTabs?.contribution) ?? {}) as ContributionDraftShape;
  }, [draftTabs?.contribution]);

  const confirmReject = async (feedback: string) => {
    if (!evaluationSnapshot) return;
    saveCouncilReviewOutcome({
      applicationId,
      caseId,
      initiativeName: evaluationSnapshot.initiativeName.trim(),
      authorName: evaluationSnapshot.authorName.trim(),
      decision: "rejected",
      recommendedRank: councilRankRecommendation.rank,
      recommendedRankDetail: councilRankRecommendation.detail,
      evidencePathLabel: councilRankRecommendation.evidencePathLabel,
      feedback: feedback || undefined,
    });
    await onCouncilReject?.();
  };

  const openReject = () => {
    if (!enableCouncilReviewActions) return;
    if (!validateSnapshotForReject(evaluationSnapshot)) return;
    setRejectOpen(true);
  };

  const openApprove = () => {
    if (!enableCouncilReviewActions) return;
    if (!validateSnapshotForApprove(evaluationSnapshot)) return;
    if (councilRankRecommendation.requiredSlotEvidenceStatusLabel === "Chưa có tệp trên kho") {
      toast.warning(
        "Không thể duyệt khi minh chứng bắt buộc trên kho còn trống — đã ghi nhận từ chối tự động.",
      );
      void confirmReject(AUTO_REJECT_EMPTY_VAULT_EVIDENCE);
      return;
    }
    setApproveOpen(true);
  };

  const confirmApprove = async () => {
    if (!evaluationSnapshot) return;
    if (councilRankRecommendation.requiredSlotEvidenceStatusLabel === "Chưa có tệp trên kho") {
      toast.error("Thiếu minh chứng trên kho — không lưu duyệt.");
      setApproveOpen(false);
      await confirmReject(AUTO_REJECT_EMPTY_VAULT_EVIDENCE);
      return;
    }
    saveCouncilReviewOutcome({
      applicationId,
      caseId,
      initiativeName: evaluationSnapshot.initiativeName.trim(),
      authorName: evaluationSnapshot.authorName.trim(),
      decision: "approved",
      recommendedRank: councilRankRecommendation.rank,
      recommendedRankDetail: councilRankRecommendation.detail,
      evidencePathLabel: councilRankRecommendation.evidencePathLabel,
      totalScore: evaluationSnapshot.totalScore,
    });
    await onCouncilApprove?.();
  };

  if (!previewDraft) {
    return (
      <p className="text-sm text-muted-foreground py-4">
        Chưa có mã case hoặc dữ liệu bản nháp từ máy chủ — không thể dựng mẫu DOCX.
      </p>
    );
  }

  const bundle = evidenceQuery.data;

  return (
    <div className="space-y-4">
      <Alert className="border-border bg-muted/30">
        {/* <AlertTitle className="text-sm font-semibold">Minh chứng trên kho (MinIO)</AlertTitle> */}
        <AlertDescription className="text-sm mt-2 space-y-2">
          {evidenceQuery.isLoading ? (
            <p className="flex items-center gap-2 text-muted-foreground">
              <Loader2 className="h-4 w-4 animate-spin shrink-0" aria-hidden />
              Đang tải trạng thái tệp từ máy chủ…
            </p>
          ) : evidenceQuery.isError ? (
            <p className="text-amber-700 dark:text-amber-400">
              Không tải được danh sách minh chứng — vẫn có thể xem mẫu DOCX; hãy thử mở kho minh chứng hoặc tải lại
              trang.
            </p>
          ) : (
            <div className="flex flex-wrap gap-2 items-center">
              {/* {(["research", "textbook", "technical"] as const).map((k) => {
                const meta = bundle?.[k];
                const ok = Boolean(meta?.storageKey);
                return (
                  <Badge
                    key={k}
                    variant={ok ? "default" : "secondary"}
                    className={ok ? "bg-green-700 hover:bg-green-700/90" : ""}
                  >
                    {evidenceSlotLabel(k)}: {ok ? meta?.originalName || "Đã có tệp" : "Chưa có"}
                  </Badge>
                );
              })} */}
            </div>
          )}
        </AlertDescription>
      </Alert>

      {enableCouncilReviewActions ? (
        <>
          <AdminApproveReviewDialog
            open={approveOpen}
            onOpenChange={setApproveOpen}
            docxCompletenessGaps={docxCompletenessGaps}
            recommendation={councilRankRecommendation}
            onConfirm={confirmApprove}
          />
          <AdminRejectReviewDialog
            open={rejectOpen}
            onOpenChange={setRejectOpen}
            docxCompletenessGaps={docxCompletenessGaps}
            evidenceSummary={councilRankRecommendation}
            onConfirm={confirmReject}
          />
        </>
      ) : null}

      <AdminDocxTemplatePreview
        draft={previewDraft}
        contribution={previewContribution}
        caseId={caseId}
        applicationId={applicationId}
        councilReviewActions={
          enableCouncilReviewActions
            ? { onReject: openReject, onApprove: openApprove }
            : undefined
        }
        docxCompletenessGaps={docxCompletenessGaps}
      />

      {enableCouncilReviewActions ? (
        <p className="text-xs text-muted-foreground">
          Điểm và nội dung Phiếu đánh giá (Mẫu 04) lấy từ tab « Phiếu Đánh Giá ». Hãy điền đủ các mục bắt buộc ở đó
          trước khi bấm Duyệt.
        </p>
      ) : (
        <p className="text-xs text-muted-foreground">
          Tài khoản quản trị: xem mẫu hồ sơ và đối chiếu minh chứng trên kho; quyết định Hội đồng thực hiện ở luồng
          council (nếu được cấp quyền).
        </p>
      )}
    </div>
  );
}
