/** Shared form state types for application + report (used by forms and initiative-draft). */

import { formatDdMmYyyy } from '@/lib/vnDateFormat';

export interface Author {
  id: number;
  name: string;
  dob: string;
  workplace: string;
  title: string;
  qualification: string;
  contributionPercent: number;
}

export interface SupportStaff {
  id: number;
  name: string;
  dob: string;
  workplace: string;
  title: string;
  qualification: string;
  supportContent: string;
}

export type ResearchEvidenceKind =
  | ''
  | 'international'
  | 'domestic'
  | 'poster'
  | 'poster-without-review';

/** Nhóm 2.2 — Xuất sắc / sách giáo trình (mã nội bộ 2.2.1, bản cam kết tác giả); 2.2.2 tài liệu tham khảo (biểu xác nhận riêng). */
export type TextbookEvidenceKind = '' | 'book' | 'reference';

/** Chỉ một loại được chọn tại một thời điểm */
export type InitiativeClassification = null | 'technical' | 'research' | 'textbook';

/** Ngày ký — chuỗi để giữ số 0 đầu (theo `data_blank.json` / docx). */
export interface NgayKy {
  ngay: string;
  thang: string;
  nam: string;
}

export interface VaiTroBaiBao {
  tac_gia_chinh: boolean;
  dong_tac_gia: boolean;
}

export interface CamKetBaiBao {
  quyen_so_huu_1: boolean;
  quyen_so_huu_2: boolean;
  dong_thuan: boolean;
  bai_bao_uy_tin: boolean;
  tuan_thu_phap_luat: boolean;
}

/** Bản cam kết tác giả bài báo (mục 3.6 hướng dẫn / `ban_cam_ket` trong `data_blank.json`). */
export interface BanCamKet {
  ngay_ky: NgayKy;
  tac_gia_dang_ky: string;
  cccd: string;
  don_vi: string;
  ten_bai_bao: string;
  nam_xet: string;
  vai_tro: VaiTroBaiBao;
  cam_ket: CamKetBaiBao;
  nguoi_cam_ket: string;
}

const EMPTY_BAN_CAM_KET: BanCamKet = {
  ngay_ky: { ngay: '', thang: '', nam: '' },
  tac_gia_dang_ky: '',
  cccd: '',
  don_vi: '',
  ten_bai_bao: '',
  nam_xet: '',
  vai_tro: { tac_gia_chinh: false, dong_tac_gia: false },
  cam_ket: {
    quyen_so_huu_1: false,
    quyen_so_huu_2: false,
    dong_thuan: false,
    bai_bao_uy_tin: false,
    tuan_thu_phap_luat: false,
  },
  nguoi_cam_ket: '',
};

export function createEmptyBanCamKet(): BanCamKet {
  return {
    ...EMPTY_BAN_CAM_KET,
    ngay_ky: { ...EMPTY_BAN_CAM_KET.ngay_ky },
    vai_tro: { ...EMPTY_BAN_CAM_KET.vai_tro },
    cam_ket: { ...EMPTY_BAN_CAM_KET.cam_ket },
  };
}

export function ensureBanCamKet(raw: Partial<BanCamKet> | null | undefined): BanCamKet {
  if (!raw) return createEmptyBanCamKet();
  return {
    ...EMPTY_BAN_CAM_KET,
    ...raw,
    ngay_ky: { ...EMPTY_BAN_CAM_KET.ngay_ky, ...raw.ngay_ky },
    vai_tro: { ...EMPTY_BAN_CAM_KET.vai_tro, ...raw.vai_tro },
    cam_ket: { ...EMPTY_BAN_CAM_KET.cam_ket, ...raw.cam_ket },
  };
}

/** Đủ điều kiện coi là đã hoàn tất bản cam kết (bài báo quốc tế). */
export function isBanCamKetComplete(b: BanCamKet): boolean {
  if (!b.tac_gia_dang_ky.trim() || !b.don_vi.trim() || !b.ten_bai_bao.trim() || !b.nguoi_cam_ket.trim()) {
    return false;
  }
  const cccdDigits = b.cccd.replace(/\D/g, '');
  if (cccdDigits.length < 8 || cccdDigits.length > 12) return false;
  if (!/^\d{4}$/.test(b.nam_xet.trim())) return false;
  if (Number(b.vai_tro.tac_gia_chinh) + Number(b.vai_tro.dong_tac_gia) !== 1) return false;
  if (!b.cam_ket.quyen_so_huu_1 && !b.cam_ket.quyen_so_huu_2) return false;
  if (!b.cam_ket.dong_thuan || !b.cam_ket.bai_bao_uy_tin || !b.cam_ket.tuan_thu_phap_luat) {
    return false;
  }
  if (!String(b.ngay_ky.ngay).trim() || !String(b.ngay_ky.thang).trim() || !/^\d{4}$/.test(String(b.ngay_ky.nam).trim())) {
    return false;
  }
  return true;
}

/** Biểu xác minh trung thực — nhóm 2.2.2 (tài liệu tham khảo); lưu trong JSON tab Đơn (không phải file MinIO). */
export interface ReferenceMaterialHonesty {
  ngay_ky: NgayKy;
  tac_gia_dang_ky: string;
  cccd: string;
  don_vi: string;
  /** Theo Quyết định xuất bản (không nhập toàn bộ nội dung tài liệu). */
  ten_tai_lieu: string;
  nam_xet: string;
  cam_ket: {
    thong_tin_trung_thuc: boolean;
    trach_nhiem_phap_luat: boolean;
    bo_sung_khi_yeu_cau: boolean;
  };
  nguoi_cam_ket: string;
}

const EMPTY_REFERENCE_HONESTY: ReferenceMaterialHonesty = {
  ngay_ky: { ngay: '', thang: '', nam: '' },
  tac_gia_dang_ky: '',
  cccd: '',
  don_vi: '',
  ten_tai_lieu: '',
  nam_xet: '',
  cam_ket: {
    thong_tin_trung_thuc: false,
    trach_nhiem_phap_luat: false,
    bo_sung_khi_yeu_cau: false,
  },
  nguoi_cam_ket: '',
};

export function createEmptyReferenceMaterialHonesty(): ReferenceMaterialHonesty {
  return {
    ...EMPTY_REFERENCE_HONESTY,
    ngay_ky: { ...EMPTY_REFERENCE_HONESTY.ngay_ky },
    cam_ket: { ...EMPTY_REFERENCE_HONESTY.cam_ket },
  };
}

export function ensureReferenceMaterialHonesty(
  raw: Partial<ReferenceMaterialHonesty> | null | undefined,
): ReferenceMaterialHonesty {
  if (!raw) return createEmptyReferenceMaterialHonesty();
  return {
    ...EMPTY_REFERENCE_HONESTY,
    ...raw,
    ngay_ky: { ...EMPTY_REFERENCE_HONESTY.ngay_ky, ...raw.ngay_ky },
    cam_ket: { ...EMPTY_REFERENCE_HONESTY.cam_ket, ...raw.cam_ket },
  };
}

export function isReferenceMaterialHonestyComplete(h: ReferenceMaterialHonesty): boolean {
  if (!h.tac_gia_dang_ky.trim() || !h.don_vi.trim() || !h.ten_tai_lieu.trim() || !h.nguoi_cam_ket.trim()) {
    return false;
  }
  const cccdDigits = h.cccd.replace(/\D/g, '');
  if (cccdDigits.length < 8 || cccdDigits.length > 12) return false;
  if (!/^\d{4}$/.test(h.nam_xet.trim())) return false;
  if (
    !h.cam_ket.thong_tin_trung_thuc ||
    !h.cam_ket.trach_nhiem_phap_luat ||
    !h.cam_ket.bo_sung_khi_yeu_cau
  ) {
    return false;
  }
  if (!String(h.ngay_ky.ngay).trim() || !String(h.ngay_ky.thang).trim() || !/^\d{4}$/.test(String(h.ngay_ky.nam).trim())) {
    return false;
  }
  return true;
}

/** Khóa trong `bieu_mau_sang_kien_template.json` → `BẢN XÁC NHẬN BÀI BÁO TRONG NƯỚC (2.1.2)` (tiêu đề phụ). */
export const RESEARCH_DOMESTIC_HONESTY_TIEU_DE_PHU_TEMPLATE_KEY =
  'Tiêu đề phụ (Áp dụng đối với cá nhân đăng ký minh chứng là bài báo tạp chí trong nước nhóm 2.1.2)';

/** Biểu xác nhận — nhóm 2.1.2 (bài báo tạp chí trong nước); JSON tab Đơn; PDF vẫn `researchEvidenceFile` → MinIO `kind=research`. */
export interface ResearchDomesticHonesty {
  ngay_ky: NgayKy;
  /** Đồng bộ trường tiêu đề phụ trong mẫu DOCX / `research_domestic_honesty.tieu_de_phu` (be01). */
  tieu_de_phu: string;
  tac_gia_dang_ky: string;
  cccd: string;
  don_vi: string;
  ten_bai_bao: string;
  nam_xet: string;
  cam_ket: {
    thong_tin_trung_thuc: boolean;
    trach_nhiem_phap_luat: boolean;
    bo_sung_khi_yeu_cau: boolean;
  };
  nguoi_cam_ket: string;
}

const EMPTY_DOMESTIC_HONESTY: ResearchDomesticHonesty = {
  ngay_ky: { ngay: '', thang: '', nam: '' },
  tieu_de_phu: '',
  tac_gia_dang_ky: '',
  cccd: '',
  don_vi: '',
  ten_bai_bao: '',
  nam_xet: '',
  cam_ket: {
    thong_tin_trung_thuc: false,
    trach_nhiem_phap_luat: false,
    bo_sung_khi_yeu_cau: false,
  },
  nguoi_cam_ket: '',
};

export function createEmptyResearchDomesticHonesty(): ResearchDomesticHonesty {
  return {
    ...EMPTY_DOMESTIC_HONESTY,
    ngay_ky: { ...EMPTY_DOMESTIC_HONESTY.ngay_ky },
    cam_ket: { ...EMPTY_DOMESTIC_HONESTY.cam_ket },
  };
}

export function ensureResearchDomesticHonesty(
  raw: Partial<ResearchDomesticHonesty> | null | undefined,
): ResearchDomesticHonesty {
  if (!raw) return createEmptyResearchDomesticHonesty();
  return {
    ...EMPTY_DOMESTIC_HONESTY,
    ...raw,
    ngay_ky: { ...EMPTY_DOMESTIC_HONESTY.ngay_ky, ...raw.ngay_ky },
    cam_ket: { ...EMPTY_DOMESTIC_HONESTY.cam_ket, ...raw.cam_ket },
  };
}

export function isResearchDomesticHonestyComplete(h: ResearchDomesticHonesty): boolean {
  if (!h.tac_gia_dang_ky.trim() || !h.don_vi.trim() || !h.ten_bai_bao.trim() || !h.nguoi_cam_ket.trim()) {
    return false;
  }
  const cccdDigits = h.cccd.replace(/\D/g, '');
  if (cccdDigits.length < 8 || cccdDigits.length > 12) return false;
  if (!/^\d{4}$/.test(h.nam_xet.trim())) return false;
  if (
    !h.cam_ket.thong_tin_trung_thuc ||
    !h.cam_ket.trach_nhiem_phap_luat ||
    !h.cam_ket.bo_sung_khi_yeu_cau
  ) {
    return false;
  }
  if (!String(h.ngay_ky.ngay).trim() || !String(h.ngay_ky.thang).trim() || !/^\d{4}$/.test(String(h.ngay_ky.nam).trim())) {
    return false;
  }
  return true;
}

export interface ApplicationFormState {
  unitName: string;
  authors: Author[];
  initiativeName: string;
  investorName: string;
  applicationField: string;
  firstApplyDate: string;
  initiativeClassification: InitiativeClassification;
  /** Minh chứng PDF — sách / giáo trình / tài liệu (nhóm 2.2), một tệp trên MinIO (`kind=textbook`). */
  textbookEvidenceFile: File | null;
  /** Phân nhánh Xuất sắc (sách/giáo trình) / 2.2.2 — độc lập với {@link researchEvidenceKind}. */
  textbookEvidenceKind: TextbookEvidenceKind;
  /** Loại minh chứng cho hồ sơ nghiên cứu */
  researchEvidenceKind: ResearchEvidenceKind;
  researchEvidenceFile: File | null;
  /** Tuyên bố tạp chí (legacy) — ưu tiên hiển thị `banCamKet` khi đã điền. */
  internationalJournalDeclaration: string;
  /** Bản cam kết tác giả (2.1.1 và Xuất sắc — Sách, giáo trình) — cấu trúc theo `ban_cam_ket` / hướng dẫn TypeScript. */
  banCamKet: BanCamKet;
  /** Xác minh trung thực — nhóm 2.2.2 (`reference_material_honesty` trong data_blank / DOCX). */
  referenceMaterialHonesty: ReferenceMaterialHonesty;
  /** Biểu xác nhận — nhóm 2.1.2 (`research_domestic_honesty` trong data_blank / DOCX). */
  researchDomesticHonesty: ResearchDomesticHonesty;
  /** Nhóm 01: văn bản chính thức do lãnh đạo đơn vị xác nhận */
  technicalEvidenceFile: File | null;
  contentSummary: string;
  confidentialInfo: string;
  conditions: string;
  authorEvaluation: string;
  trialEvaluation: string;
  supportStaff: SupportStaff[];
  /** Cam kết trung thực (§ cuối Đơn) — lưu trong bản nháp / JSON tab. */
  honestyConfirmed: boolean;
  submissionDay: number;
  submissionMonth: number;
  submissionYear: string;
}

export interface TrialUnit {
  id: number;
  name: string;
  address: string;
  field: string;
}

export interface InitiativeFormState {
  introduction: string;
  initiativeName: string;
  representativeAuthor: string;
  representativePhone: string;
  representativeEmail: string;
  applicationField: string;
  currentStatus: string;
  purpose: string;
  solutionContent: string;
  implementationSteps: string;
  firstAppliedUnit: string;
  achievedResult: string;
  conditions: string;
  trialUnits: TrialUnit[];
  novelty: string;
  effectiveness: {
    economic: string;
    social: string;
    teaching: string;
    productivity: string;
    quality: string;
    environment: string;
    safety: string;
  };
  confidentialInfo: string;
  submissionDate: string;
  authorName: string;
  /** Cam kết trung thực (§ cuối Báo cáo) — lưu trong bản nháp / JSON tab. */
  honestyConfirmed: boolean;
}

export const INITIAL_APPLICATION_FORM_STATE: ApplicationFormState = {
  unitName: '',
  authors: [
    { id: 1, name: '', dob: '', workplace: '', title: '', qualification: '', contributionPercent: 100 },
  ],
  initiativeName: '',
  investorName: '',
  applicationField: '',
  firstApplyDate: '',
  initiativeClassification: null,
  textbookEvidenceFile: null,
  textbookEvidenceKind: '',
  researchEvidenceKind: '',
  researchEvidenceFile: null,
  internationalJournalDeclaration: '',
  banCamKet: createEmptyBanCamKet(),
  referenceMaterialHonesty: createEmptyReferenceMaterialHonesty(),
  researchDomesticHonesty: createEmptyResearchDomesticHonesty(),
  technicalEvidenceFile: null,
  contentSummary: '',
  confidentialInfo: '',
  conditions: '',
  authorEvaluation: '',
  trialEvaluation: '',
  supportStaff: [],
  honestyConfirmed: false,
  submissionDay: new Date().getDate(),
  submissionMonth: new Date().getMonth() + 1,
  submissionYear: '2026',
};

export const INITIAL_REPORT_FORM_STATE: InitiativeFormState = {
  introduction: '',
  initiativeName: '',
  representativeAuthor: '',
  representativePhone: '',
  representativeEmail: '',
  applicationField: '',
  currentStatus: '',
  purpose: '',
  solutionContent: '',
  implementationSteps: '',
  firstAppliedUnit: '',
  achievedResult: '',
  conditions: '',
  trialUnits: [],
  novelty: '',
  effectiveness: {
    economic: '',
    social: '',
    teaching: '',
    productivity: '',
    quality: '',
    environment: '',
    safety: '',
  },
  confidentialInfo: '',
  submissionDate: formatDdMmYyyy(new Date()),
  authorName: '',
  honestyConfirmed: false,
};
