/**
 * Governance model for the publisher workflow — the "Triết lý vận hành" (operating philosophy).
 *
 * These are the spec's core invariants (academic-research-skills-spec.md §1) expressed as the
 * principles that govern publishing, each paired with how the publisher *actually* enforces it.
 * The compliance status is computed from the investigator's papers so the page is a live
 * governance dashboard, not just a poster.
 */
import { extractPapers, integrityIssues, type Paper } from './paperModel';
import type { ResearchProject } from '@ump/shared';

/** Icon keys resolved to lucide components in the presentation layer (keeps this module pure). */
export type PrincipleIcon = 'human' | 'bot' | 'sourced' | 'gate';

export interface GovernancePrinciple {
  id: 'inv-1' | 'inv-2' | 'inv-3' | 'inv-4';
  icon: PrincipleIcon;
  title: string;
  description: string;
  /** danger ⇒ rendered with the red accent (the diagram's red "!"). */
  tone: 'default' | 'danger';
  /** How the publisher workflow enforces this principle. */
  enforcement: string;
}

export const OPERATING_PRINCIPLES: GovernancePrinciple[] = [
  {
    id: 'inv-1',
    icon: 'human',
    title: 'Con người trong vòng kiểm soát (Human-in-the-loop)',
    description: 'AI đề xuất, con người quyết định. Mọi quyết định cuối cùng thuộc về nhà nghiên cứu.',
    tone: 'default',
    enforcement: 'Bài báo chỉ chuyển sang trạng thái “Đã xuất bản” qua cổng phê duyệt của con người.',
  },
  {
    id: 'inv-2',
    icon: 'bot',
    title: 'AI là trợ lý nghiên cứu, không thay thế nhà nghiên cứu',
    description: 'AI hỗ trợ soạn thảo và rà soát; tác giả chịu trách nhiệm chính là con người.',
    tone: 'default',
    enforcement: 'Người phê duyệt được ghi nhận là chủ sở hữu chịu trách nhiệm trên mỗi bài báo.',
  },
  {
    id: 'inv-3',
    icon: 'sourced',
    title: 'Mọi đầu ra cần nguồn, bằng chứng và kiểm chứng',
    description: 'Không luận điểm nào được công bố mà thiếu nguồn đã xác minh.',
    tone: 'default',
    enforcement: 'Cổng kiểm soát chặn xuất bản nếu thiếu nội dung hoặc còn nguồn chưa xác minh.',
  },
  {
    id: 'inv-4',
    icon: 'gate',
    title: 'Không chuyển giai đoạn nếu chưa qua checkpoint chất lượng',
    description: 'Mỗi giai đoạn bắt buộc phải vượt qua cổng kiểm soát trước khi tiến tới.',
    tone: 'danger',
    enforcement: 'Nút “Phê duyệt & Xuất bản” bị khoá khi bài báo chưa đạt cổng tính toàn vẹn.',
  },
];

/** The dashed footer note in the diagram — the human's irreducible role. */
export const HUMAN_ROLE_NOTE =
  'Vai trò con người: chọn câu hỏi, phương pháp, diễn giải kết quả, phê duyệt cuối.';

export interface GovernanceStatus {
  totalPapers: number;
  published: number;
  drafts: number;
  /** INV-1: published papers that carry a human-approval record (target: == published). */
  publishedWithApproval: number;
  /** INV-3: drafts currently blocked by the integrity gate (unsourced / incomplete). */
  draftsBlockedByIntegrity: number;
  /** Drafts that satisfy the integrity gate and are ready for the human-approval step. */
  draftsReadyToPublish: number;
}

/** Aggregate a flat list of papers into a governance-compliance snapshot. */
export function statusFromPapers(papers: Paper[]): GovernanceStatus {
  const published = papers.filter((p) => p.status === 'published');
  const drafts = papers.filter((p) => p.status !== 'published');
  return {
    totalPapers: papers.length,
    published: published.length,
    drafts: drafts.length,
    publishedWithApproval: published.filter((p) => !!p.approval).length,
    draftsBlockedByIntegrity: drafts.filter((p) => integrityIssues(p).length > 0).length,
    draftsReadyToPublish: drafts.filter((p) => integrityIssues(p).length === 0).length,
  };
}

/** Flatten every paper across the investigator's projects, then summarize. */
export function statusFromProjects(projects: ResearchProject[]): GovernanceStatus {
  const all = projects.flatMap((p) => extractPapers(p.content));
  return statusFromPapers(all);
}

/** INV-1 holds iff every published paper carries a human-approval record. */
export function humanApprovalIntact(status: GovernanceStatus): boolean {
  return status.published === status.publishedWithApproval;
}
