// Cockpit entity configuration — ported from the PIProjectCockpit artifact, field keys
// aligned to the be0 research_project_* tables. Drives the entity cards + the editor dialog.
import {
  Boxes,
  CalendarClock,
  Cpu,
  Database,
  Users,
  type LucideIcon,
} from 'lucide-react';

export type CockpitFieldType = 'text' | 'textarea' | 'number' | 'select';

export interface CockpitField {
  key: string;
  label: string;
  type: CockpitFieldType;
  options?: string[];
  default?: string;
  min?: number;
  max?: number;
  step?: number;
}

export interface EntityConfig {
  icon: LucideIcon;
  title: string;
  singular: string;
  accent: string;
  primary: string;
  secondary: [string, string][];
  badge: string;
  accessKey?: string;
  metrics?: [string, string][];
  progress?: string;
  fields: CockpitField[];
}

const sel = (key: string, label: string, options: string[], def?: string): CockpitField => ({
  key,
  label,
  type: 'select',
  options,
  default: def,
});
const txt = (key: string, label: string): CockpitField => ({ key, label, type: 'text' });
const area = (key: string, label: string): CockpitField => ({ key, label, type: 'textarea' });
const num = (key: string, label: string, extra: Partial<CockpitField> = {}): CockpitField => ({
  key,
  label,
  type: 'number',
  ...extra,
});

const ACCESS_LABELS = ['Chủ nhiệm (PI)', 'Điều phối / Thư ký', 'Kỹ sư ML', 'CTV lâm sàng', 'Quan sát'];

export const ENTITIES: Record<string, EntityConfig> = {
  members: {
    icon: Users,
    title: 'Thành viên',
    singular: 'thành viên',
    accent: 'text-sky-600',
    primary: 'name',
    secondary: [
      ['role', ''],
      ['org', ''],
    ],
    badge: 'status',
    accessKey: 'access',
    fields: [
      txt('name', 'Họ và tên, học vị'),
      sel('role', 'Vai trò trong đề tài', ['Chủ nhiệm đề tài', 'Thư ký khoa học', 'Thành viên chính', 'Kỹ thuật viên', 'Cộng tác viên'], 'Thành viên chính'),
      sel('access', 'Quyền truy cập (RBAC)', ACCESS_LABELS, 'Quan sát'),
      txt('org', 'Tổ chức công tác'),
      txt('email', 'E-mail'),
      num('months', 'Thời gian tham gia (tháng)', { min: 0 }),
      area('tasks', 'Nhiệm vụ phụ trách'),
      sel('status', 'Trạng thái', ['Đang hoạt động', 'Chờ xác nhận', 'Tạm dừng'], 'Đang hoạt động'),
    ],
  },
  datasets: {
    icon: Database,
    title: 'Dữ liệu',
    singular: 'bộ dữ liệu',
    accent: 'text-teal-600',
    primary: 'name',
    secondary: [
      ['type', ''],
      ['records', ' bản ghi'],
    ],
    badge: 'status',
    fields: [
      txt('name', 'Tên bộ dữ liệu'),
      sel('type', 'Loại dữ liệu', ['Ảnh CLVT', 'Nhãn phân đoạn', 'Dữ liệu lâm sàng', 'Bảng số liệu'], 'Ảnh CLVT'),
      num('records', 'Số lượng bản ghi', { min: 0 }),
      txt('source', 'Nguồn / nơi thu thập'),
      sel('sensitivity', 'Mức nhạy cảm', ['PII', 'Đã ẩn danh', 'Công khai'], 'Đã ẩn danh'),
      sel('ethics', 'Phê duyệt y đức', ['Đã duyệt', 'Chờ duyệt', 'Không yêu cầu'], 'Chờ duyệt'),
      txt('owner', 'Người phụ trách'),
      sel('status', 'Trạng thái', ['Đang thu thập', 'Đang làm sạch', 'Sẵn sàng', 'Khóa'], 'Đang thu thập'),
    ],
  },
  models: {
    icon: Cpu,
    title: 'Mô hình',
    singular: 'mô hình',
    accent: 'text-violet-600',
    primary: 'name',
    secondary: [
      ['task', ''],
      ['version', ''],
    ],
    badge: 'status',
    metrics: [
      ['auc', 'AUC'],
      ['sensitivity', 'Độ nhạy'],
      ['specificity', 'Độ đặc hiệu'],
      ['accuracy', 'Độ chính xác'],
    ],
    fields: [
      txt('name', 'Tên mô hình'),
      txt('task', 'Bài toán'),
      sel('framework', 'Framework', ['PyTorch', 'TensorFlow', 'MONAI', 'nnU-Net', 'scikit-learn'], 'PyTorch'),
      txt('version', 'Phiên bản'),
      txt('dataset', 'Bộ dữ liệu sử dụng'),
      num('auc', 'AUC', { min: 0, max: 1, step: 0.01 }),
      num('sensitivity', 'Độ nhạy', { min: 0, max: 1, step: 0.01 }),
      num('specificity', 'Độ đặc hiệu', { min: 0, max: 1, step: 0.01 }),
      num('accuracy', 'Độ chính xác', { min: 0, max: 1, step: 0.01 }),
      txt('owner', 'Người phụ trách'),
      area('notes', 'Ghi chú'),
      sel('status', 'Trạng thái', ['Kế hoạch', 'Đang huấn luyện', 'Đang đánh giá', 'Đã triển khai'], 'Kế hoạch'),
    ],
  },
  assets: {
    icon: Boxes,
    title: 'Tài sản',
    singular: 'tài sản',
    accent: 'text-amber-600',
    primary: 'name',
    secondary: [
      ['category', ''],
      ['acquisition', ''],
    ],
    badge: 'status',
    fields: [
      txt('name', 'Tên tài sản'),
      sel('category', 'Phân loại', ['Thiết bị', 'Phần mềm', 'Giấy phép', 'Sản phẩm bàn giao'], 'Thiết bị'),
      sel('acquisition', 'Hình thức', ['Hiện có', 'Điều chuyển', 'Thuê', 'Mua mới'], 'Hiện có'),
      num('value', 'Giá trị (triệu đồng)', { min: 0 }),
      txt('owner', 'Người quản lý'),
      area('notes', 'Thông số / ghi chú'),
      sel('status', 'Trạng thái', ['Đang dùng', 'Đặt mua', 'Bảo trì', 'Ngừng'], 'Đang dùng'),
    ],
  },
  milestones: {
    icon: CalendarClock,
    title: 'Tiến độ',
    singular: 'mốc tiến độ',
    accent: 'text-rose-600',
    primary: 'title',
    secondary: [
      ['start', ''],
      ['end', ''],
    ],
    badge: 'status',
    progress: 'progress',
    fields: [
      txt('title', 'Nội dung / công việc'),
      area('deliverable', 'Kết quả phải đạt'),
      txt('start', 'Bắt đầu (tháng/năm)'),
      txt('end', 'Kết thúc (tháng/năm)'),
      txt('owner', 'Chủ trì'),
      num('budget', 'Kinh phí (triệu đồng)', { min: 0 }),
      num('progress', 'Tiến độ (%)', { min: 0, max: 100, step: 5 }),
      sel('status', 'Trạng thái', ['Chưa bắt đầu', 'Đang thực hiện', 'Hoàn thành', 'Trễ hạn'], 'Chưa bắt đầu'),
    ],
  },
};

export const ENTITY_ORDER = ['members', 'datasets', 'models', 'assets', 'milestones'] as const;
export type CockpitEntityKey = (typeof ENTITY_ORDER)[number];

// Status → tone (semantic colors for the dashboard badges).
export type Tone = 'emerald' | 'blue' | 'violet' | 'amber' | 'rose' | 'slate';
const STATUS_TONE: Record<string, Tone> = {
  'Sẵn sàng': 'emerald', 'Đã triển khai': 'emerald', 'Hoàn thành': 'emerald', 'Đã duyệt': 'emerald',
  'Đang dùng': 'emerald', 'Đang hoạt động': 'emerald',
  'Đang đánh giá': 'blue', 'Đang thực hiện': 'blue',
  'Đang huấn luyện': 'violet',
  'Đang thu thập': 'amber', 'Đang làm sạch': 'amber', 'Chờ duyệt': 'amber', 'Đặt mua': 'amber',
  'Bảo trì': 'amber', 'Chưa bắt đầu': 'amber', 'Kế hoạch': 'amber', 'Chờ xác nhận': 'amber', 'Thuê': 'amber',
  'Trễ hạn': 'rose', 'Khóa': 'rose', 'PII': 'rose', 'Ngừng': 'rose', 'Tạm dừng': 'rose',
};
const TONE_CLASS: Record<Tone, string> = {
  emerald: 'bg-emerald-100 text-emerald-700 border-emerald-200',
  blue: 'bg-blue-100 text-blue-700 border-blue-200',
  violet: 'bg-violet-100 text-violet-700 border-violet-200',
  amber: 'bg-amber-100 text-amber-700 border-amber-200',
  rose: 'bg-rose-100 text-rose-700 border-rose-200',
  slate: 'bg-slate-100 text-slate-600 border-slate-200',
};
export const toneClass = (v: unknown): string => TONE_CLASS[STATUS_TONE[String(v)] ?? 'slate'];

export const fmt = (n: unknown): string => (Number(n) || 0).toLocaleString('vi-VN');
export const pct = (n: unknown): number => (n == null ? 0 : Math.max(0, Math.min(100, Number(n))));
export const asNum = (n: unknown): number => Number(n) || 0;
export const asStr = (v: unknown): string => (v == null ? '' : String(v));
