// Administrative-detail schema for the project cockpit — mirrors the institutional
// "đề tài" detail sheet (Thông tin chung / Hợp đồng / Kinh phí / Thời gian / Nghiệm thu).
// One config drives BOTH the read-only section panels AND the edit dialog.
//
// Storage: every `key` is a flat (optionally dotted) key inside ResearchProject.content
// JSONB. Some keys are REUSED from the proposal form (tenDeTai, chuNhiem.hoTen, tongKinhPhi,
// kinhPhiKhoan, kinhPhiKhongKhoan, thoiGianThucHienThang, capDeTai, loaiHinhDeTai, maSo);
// the rest are net-new administrative fields filled in at cockpit time. Edits are persisted
// via updateProjectDetail() which shallow-merges, so the proposal keys are never clobbered.

export type DetailFieldType = 'text' | 'textarea' | 'number' | 'money' | 'months' | 'date' | 'select';

export interface DetailField {
  key: string;
  label: string;
  type: DetailFieldType;
  options?: string[];
  full?: boolean;
}

export interface DetailSection {
  index: string; // roman numeral shown in the panel header
  tab: string; // tab id this section renders under
  title: string; // panel + tab title
  fields: DetailField[];
}

const STATUS_OPTIONS = ['Chưa có', 'Đang thực hiện', 'Tạm dừng', 'Hoàn thành', 'Trễ hạn'];
const GRADE_OPTIONS = ['Xuất sắc', 'Tốt', 'Khá', 'Đạt', 'Không đạt'];

/** Section → tab id. Keep in sync with the cockpit tab list. */
export const DETAIL_TABS = {
  general: 'general',
  contract: 'contract',
  funding: 'funding',
  timeline: 'timeline',
  acceptance: 'acceptance',
} as const;

export const DETAIL_SECTIONS: DetailSection[] = [
  {
    index: 'I',
    tab: 'general',
    title: 'Thông tin chung',
    fields: [
      { key: 'tenDeTai', label: 'Tên đề tài', type: 'text', full: true },
      { key: 'chuNhiem.hoTen', label: 'Chủ nhiệm', type: 'text' },
      { key: 'chuNhiem.gioiTinh', label: 'Giới tính', type: 'text' },
      { key: 'chuNhiem.namSinh', label: 'Năm sinh', type: 'text' },
      { key: 'khoaDonVi', label: 'Khoa / Đơn vị', type: 'text' },
      { key: 'boMon', label: 'Bộ môn', type: 'text' },
      { key: 'linhVucNC', label: 'Lĩnh vực NC', type: 'text' },
      { key: 'loaiHinhDeTai', label: 'Loại hình NC', type: 'text' },
      { key: 'capDeTai', label: 'Loại đề tài', type: 'text' },
      { key: 'thanhVienNC', label: 'Thành viên NC', type: 'textarea', full: true },
    ],
  },
  {
    index: 'II',
    tab: 'contract',
    title: 'Hợp đồng & Quyết định',
    fields: [
      { key: 'soHopDong', label: 'Số hợp đồng', type: 'text' },
      { key: 'phuLucHopDong', label: 'Phụ lục hợp đồng', type: 'text' },
      { key: 'ngayKyHopDong', label: 'Ngày ký HĐ', type: 'date' },
      { key: 'qdXetDuyet', label: 'QĐ xét duyệt', type: 'text' },
      { key: 'qdPheDuyet', label: 'QĐ phê duyệt', type: 'text' },
      { key: 'soGCNKetQua', label: 'Số GCN kết quả', type: 'text' },
      { key: 'ngayCapGCN', label: 'Ngày cấp GCN', type: 'date' },
      { key: 'coQuanCapGCN', label: 'Cơ quan cấp GCN', type: 'text' },
    ],
  },
  {
    index: 'III',
    tab: 'funding',
    title: 'Kinh phí & Phân bổ',
    fields: [
      { key: 'tongKinhPhi', label: 'Tổng kinh phí', type: 'money' },
      { key: 'kinhPhiKhoan', label: 'Kinh phí khoán', type: 'money' },
      { key: 'kinhPhiKhongKhoan', label: 'Kinh phí không khoán', type: 'money' },
      { key: 'nguonKhac', label: 'Nguồn khác', type: 'money' },
      { key: 'capDot1', label: 'Cấp đợt 1', type: 'money' },
      { key: 'capDot2', label: 'Cấp đợt 2', type: 'money' },
      { key: 'capDot3', label: 'Cấp đợt 3', type: 'money' },
    ],
  },
  {
    index: 'IV',
    tab: 'timeline',
    title: 'Thời gian & Tiến độ',
    fields: [
      { key: 'thoiGianThucHienThang', label: 'Thời gian TH', type: 'months' },
      { key: 'thoiGianBatDau', label: 'Bắt đầu', type: 'date' },
      { key: 'thoiGianKetThuc', label: 'Kết thúc', type: 'date' },
      { key: 'giaHan', label: 'Gia hạn', type: 'text' },
      { key: 'trangThaiTienDo', label: 'Tiến độ thực hiện', type: 'select', options: STATUS_OPTIONS },
      { key: 'baoCaoGiamDinh', label: 'Báo cáo giám định', type: 'date' },
      { key: 'bcTienDo1', label: 'BC tiến độ 1', type: 'date' },
      { key: 'bcTienDo2', label: 'BC tiến độ 2', type: 'date' },
      { key: 'bcTienDo3', label: 'BC tiến độ 3', type: 'date' },
      { key: 'bcTienDo4', label: 'BC tiến độ 4', type: 'date' },
      { key: 'ngayNhac', label: 'Ngày nhắc', type: 'date' },
      { key: 'ghiChuBaoCao', label: 'Ghi chú báo cáo', type: 'textarea', full: true },
    ],
  },
  {
    index: 'V',
    tab: 'acceptance',
    title: 'Nghiệm thu',
    fields: [
      { key: 'ngayNghiemThu', label: 'Ngày nghiệm thu', type: 'date' },
      { key: 'soQDNghiemThu', label: 'Số QĐ nghiệm thu', type: 'text' },
      { key: 'xepLoaiNghiemThu', label: 'Xếp loại', type: 'select', options: GRADE_OPTIONS },
      { key: 'hoiDongNghiemThu', label: 'Hội đồng nghiệm thu', type: 'textarea', full: true },
      { key: 'ketQuaNghiemThu', label: 'Kết quả nghiệm thu', type: 'textarea', full: true },
      { key: 'ghiChuNghiemThu', label: 'Ghi chú', type: 'textarea', full: true },
    ],
  },
];

export const SECTION_BY_TAB: Record<string, DetailSection> = Object.fromEntries(
  DETAIL_SECTIONS.map((s) => [s.tab, s]),
);

/** Read a (possibly dotted) content key. Keys in content are flat strings, so a direct lookup. */
export function readContent(content: Record<string, unknown> | undefined, key: string): unknown {
  if (!content) return undefined;
  return content[key];
}

/** Money in triệu/đồng → grouped string. Accepts number or numeric string. */
export function fmtMoney(v: unknown): string {
  const n = Number(v);
  if (!v || Number.isNaN(n)) return '';
  return n.toLocaleString('vi-VN') + ' VNĐ';
}

/** Format a field value for the READ panel per its type. Returns '' when empty (panel shows ---). */
export function displayValue(field: DetailField, raw: unknown): string {
  if (raw === undefined || raw === null || raw === '') return '';
  switch (field.type) {
    case 'money':
      return fmtMoney(raw);
    case 'months':
      return `${raw} tháng`;
    default:
      return String(raw);
  }
}
