/* ============================================================
   Media SOP — Data layer (pricing, editors, orders, KPI)
   ============================================================ */

// Order of levels low → high
const LEVELS = [
  "Junior", "Member 1E", "Member 1D", "Member 1C", "Member 1B", "Member 1A",
  "Member 2E", "Member 2D", "Member 2C", "Member 2B", "Member 2A", "Senior",
];

// Hours per video by [videoType][level]. null = level not eligible.
const RATE = {
  V1: { "Junior":4,"Member 1E":4,"Member 1D":3.6,"Member 1C":3.2,"Member 1B":2.8,"Member 1A":2.4,"Member 2E":2,"Member 2D":1.9,"Member 2C":1.8,"Member 2B":1.7,"Member 2A":1.6,"Senior":1.5 },
  V2: { "Junior":8,"Member 1E":7.5,"Member 1D":7,"Member 1C":6.5,"Member 1B":6,"Member 1A":5.5,"Member 2E":5,"Member 2D":4.6,"Member 2C":4.2,"Member 2B":3.8,"Member 2A":3.4,"Senior":3 },
  V3: { "Junior":null,"Member 1E":null,"Member 1D":null,"Member 1C":null,"Member 1B":null,"Member 1A":12.5,"Member 2E":11.75,"Member 2D":11,"Member 2C":10.25,"Member 2B":9.5,"Member 2A":8.75,"Senior":8 },
  V4: { "Junior":null,"Member 1E":null,"Member 1D":null,"Member 1C":null,"Member 1B":null,"Member 1A":null,"Member 2E":null,"Member 2D":null,"Member 2C":28,"Member 2B":24,"Member 2A":20,"Senior":16 },
};

const VIDEO_TYPES = {
  V1: { code: "V1", name: "Video ngắn", desc: "Cắt ghép cơ bản, ít hiệu ứng (kiểu TikTok)", cls: "v1" },
  V2: { code: "V2", name: "Video phức tạp", desc: "Training, recap sự kiện, Podcast, Talkshow — nhiều hiệu ứng, tư liệu", cls: "v2" },
  V3: { code: "V3", name: "Motion Graphics", desc: "QC LED, background động đơn giản", cls: "v3" },
  V4: { code: "V4", name: "AE Visual / Animation", desc: "Visual dấu ấn, sinh nhật, NVĐ", cls: "v4" },
  QUAY: { code: "QUAY", name: "Quay", desc: "Theo thời gian order — nhập giờ thực tế (≤ +20%)", cls: "quay" },
  LIVE: { code: "LIVE", name: "Livestream", desc: "Cơ bản 1 góc (1h) / Trung bình 2–3 góc (2h) + vận hành", cls: "live" },
};

const ADDONS = {
  resize: { key: "resize", label: "Resize nhiều kích thước",
    pcts: { V1: 0.30, V2: 0.30, V3: 0.60, V4: 0.60 }, defaultPct: 0.30, editable: false,
    note: "+30% (V1, V2) · +60% (V3, V4) so với giờ định mức" },
  subtitle: { key: "subtitle", label: "Subtitle Full",
    pcts: null, defaultPct: 0.25, editable: true,
    note: "Theo dự án — nhập % so với giờ định mức (mặc định 25%)" },
};

// % của add-on so với giờ định mức gốc (base rate theo loại video × level)
function addonPct(key, vtype, override) {
  const a = ADDONS[key];
  if (!a) return 0;
  if (override != null && !isNaN(override)) return override;   // % do quản lý nhập (theo dự án)
  if (a.pcts && a.pcts[vtype] != null) return a.pcts[vtype];
  return a.defaultPct || 0;
}

const PRIORITIES = {
  urgent: { key: "urgent", label: "Gấp", cls: "badge-red" },
  high: { key: "high", label: "Cao", cls: "badge-pink" },
  normal: { key: "normal", label: "Trung bình", cls: "badge-amber" },
  low: { key: "low", label: "Thấp", cls: "badge-gray" },
};

// Kanban / workflow stages (steps 1–6/7)
const STAGES = [
  { key: "intake",   label: "Chờ tiếp nhận", step: 1, color: "oklch(0.72 0.012 285)" },
  { key: "doing",    label: "Đang thực hiện", step: 3, color: "oklch(0.58 0.23 290)" },
  { key: "feedback", label: "Chờ feedback / Sửa", step: 4, color: "oklch(0.78 0.15 70)" },
  { key: "review",   label: "Chờ nghiệm thu", step: 5, color: "oklch(0.72 0.14 210)" },
  { key: "done",     label: "Hoàn tất & Lưu trữ", step: 6, color: "oklch(0.68 0.15 152)" },
];
const STAGE_MAP = Object.fromEntries(STAGES.map(s => [s.key, s]));

const NORM_HOURS = 155; // Thời gian định mức (chuẩn)
const JOB_TITLES = ["Editor", "Editor + Quản lý", "Lead Editor", "Senior Editor", "Motion Designer", "Quay phim"];

const AVATAR_COLORS = [
  "linear-gradient(135deg,oklch(0.62 0.20 290),oklch(0.58 0.20 320))",
  "linear-gradient(135deg,oklch(0.66 0.16 210),oklch(0.60 0.20 250))",
  "linear-gradient(135deg,oklch(0.70 0.16 30),oklch(0.66 0.18 355))",
  "linear-gradient(135deg,oklch(0.68 0.15 152),oklch(0.66 0.15 190))",
  "linear-gradient(135deg,oklch(0.74 0.15 70),oklch(0.70 0.17 40))",
];

function initials(name) {
  const p = name.trim().split(/\s+/);
  return (p[p.length - 2]?.[0] || "") + (p[p.length - 1]?.[0] || "");
}

// ---- Seed editors (with current-period KPI source numbers) ----
let _eid = 1;
const mkEditor = (name, level, color, stats) => ({
  id: "ed" + (_eid++), name, level, color,
  jobTitle: stats.jobTitle || "Editor",  // vai trò chuyên môn
  normHours: stats.normHours ?? NORM_HOURS, // thời gian định mức riêng (giờ/kỳ)
  actualHours: stats.actual,         // số giờ thực tế trong kỳ
  products: stats.products,          // tổng thành phẩm hoàn thành
  hiStar: stats.hiStar,              // số thành phẩm ≥ 4 sao
  onTime: stats.onTime,              // số đúng deadline
  trend: stats.trend,                // 6-month hiệu suất %
  activeTasks: stats.activeTasks,
});

const SEED_EDITORS = [
  mkEditor("Hoàng Anh Tuấn", "Senior", AVATAR_COLORS[0],
    { jobTitle: "Lead Editor", normHours: 120, actual: 124, products: 24, hiStar: 22, onTime: 23, trend: [98,103,109,106,111,108], activeTasks: 3 }),
  mkEditor("Lê Phương Anh", "Member 2D", AVATAR_COLORS[2],
    { jobTitle: "Editor", normHours: 155, actual: 152, products: 19, hiStar: 15, onTime: 16, trend: [88,92,95,99,96,98], activeTasks: 2 }),
  mkEditor("Dương Minh Trường", "Member 1A", AVATAR_COLORS[1],
    { jobTitle: "Editor", normHours: 155, actual: 149, products: 21, hiStar: 18, onTime: 20, trend: [91,94,90,97,95,96], activeTasks: 2 }),
];

// ---- KPI math ----
function normOf(ed) { return ed.normHours ?? NORM_HOURS; }                   // định mức riêng
function performance(ed) { return ed.actualHours / normOf(ed); }            // Hiệu suất
function qualityScore(ed) { return ed.products ? ed.hiStar / ed.products : 0; } // Điểm chất lượng
function deadlineScore(ed) { return ed.products ? ed.onTime / ed.products : 0; } // Điểm deadline
function kpiScore(ed) { return performance(ed) * qualityScore(ed) * deadlineScore(ed); }

function perfBand(p) {
  const pct = p * 100;
  if (pct < 95) return { key: "fail", label: "Không đạt", cls: "band-fail" };
  if (pct <= 105) return { key: "ok", label: "Đạt KPIs", cls: "band-ok" };
  if (pct <= 120) return { key: "bonus", label: "Thưởng", cls: "band-bonus" };
  return { key: "over", label: "Thưởng & Check quá tải", cls: "band-over" };
}
const pct = (x) => Math.round(x * 1000) / 10; // 1 decimal %

// ---- Seed orders ----
const today = new Date(2026, 4, 30); // 30 May 2026
const dstr = (d) => { const x = new Date(today); x.setDate(x.getDate() + d); return x.toISOString().slice(0,10); };
let _oid = 1042;
const mkOrder = (o) => ({
  id: "ORD-" + (_oid++),
  addons: [], actualHours: null, rating: null, deadlineMet: null, finalLink: null,
  feedback: [], createdAt: dstr(-3), ...o,
});

const SEED_ORDERS = [
  mkOrder({ title: "Recap Hội nghị Đối tác Q2", vtype: "V2", purpose: "Đăng fanpage & gửi đối tác sau sự kiện",
    requester: "Nguyễn Thu Hà", dept: "Marketing", deadline: dstr(4), priority: "high",
    stage: "intake", addons: ["resize", "subtitle"], createdAt: dstr(0) }),
  mkOrder({ title: "Series TikTok tuyển dụng (5 video)", vtype: "V1", purpose: "Tăng nhận diện tuyển dụng tháng 6",
    requester: "Phạm Gia Bảo", dept: "HR", deadline: dstr(6), priority: "normal",
    stage: "intake", createdAt: dstr(-1) }),
  mkOrder({ title: "Motion intro Lễ trao giải", vtype: "V3", purpose: "Phát trên màn LED sân khấu",
    requester: "Lý Khánh Vy", dept: "Sự kiện", deadline: dstr(2), priority: "urgent",
    stage: "doing", editorId: "ed1", estimateHours: 8, addons: ["resize"], createdAt: dstr(-2) }),
  mkOrder({ title: "Podcast tập 12 — Nghề Media", vtype: "V2", purpose: "Đăng YouTube & Spotify",
    requester: "Trần Quốc Bảo", dept: "Content", deadline: dstr(5), priority: "normal",
    stage: "doing", editorId: "ed2", estimateHours: 4.6, createdAt: dstr(-2) }),
  mkOrder({ title: "Video sinh nhật công ty (Animation)", vtype: "V4", purpose: "Mở màn gala kỷ niệm",
    requester: "Đỗ Hải Yến", dept: "Nội bộ", deadline: dstr(9), priority: "high",
    stage: "doing", editorId: "ed1", estimateHours: 16, createdAt: dstr(-1) }),
  mkOrder({ title: "Cắt highlight Talkshow khách mời", vtype: "V1", purpose: "Teaser quảng bá tập mới",
    requester: "Nguyễn Thu Hà", dept: "Marketing", deadline: dstr(1), priority: "high",
    stage: "feedback", editorId: "ed3", estimateHours: 2.4,
    feedback: [{ by: "Nguyễn Thu Hà", role: "order", text: "Đoạn 0:45 cắt hơi gấp, mở thêm 1s giúp mình nhé.", at: "Hôm nay 09:12" }],
    createdAt: dstr(-3) }),
  mkOrder({ title: "Quay buổi training nội bộ T6", vtype: "QUAY", purpose: "Lưu tư liệu & dựng recap sau",
    requester: "Phạm Gia Bảo", dept: "HR", deadline: dstr(-1), priority: "normal",
    stage: "review", editorId: "ed3", estimateHours: 6, actualHours: 6.5,
    finalLink: "drive/media/2026-06/training-T6", createdAt: dstr(-4) }),
  mkOrder({ title: "Recap Workshop Thương hiệu", vtype: "V2", purpose: "Gửi học viên & đăng kênh",
    requester: "Lý Khánh Vy", dept: "Sự kiện", deadline: dstr(-2), priority: "normal",
    stage: "review", editorId: "ed2", estimateHours: 4.6, actualHours: 4.2,
    finalLink: "drive/media/2026-05/workshop-th", createdAt: dstr(-6) }),
  mkOrder({ title: "Livestream VĐTT Vòng loại", vtype: "LIVE", purpose: "Phát trực tiếp fanpage",
    requester: "Đỗ Hải Yến", dept: "Sự kiện", deadline: dstr(-5), priority: "high",
    stage: "done", editorId: "ed3", estimateHours: 4, actualHours: 4, rating: 5, deadlineMet: true,
    finalLink: "drive/media/2026-05/live-vdtt", createdAt: dstr(-8) }),
  mkOrder({ title: "Bộ video QC LED màn hình lớn", vtype: "V3", purpose: "Trình chiếu khai mạc",
    requester: "Nguyễn Thu Hà", dept: "Marketing", deadline: dstr(-3), priority: "normal",
    stage: "done", editorId: "ed1", estimateHours: 8, actualHours: 7.5, rating: 4, deadlineMet: true,
    finalLink: "drive/media/2026-05/qc-led", createdAt: dstr(-9) }),
  mkOrder({ title: "Video recap Team Building", vtype: "V2", purpose: "Đăng nội bộ & fanpage",
    requester: "Phạm Gia Bảo", dept: "HR", deadline: dstr(-6), priority: "low",
    stage: "done", editorId: "ed2", estimateHours: 4.6, actualHours: 5.1, rating: 3, deadlineMet: false,
    finalLink: "drive/media/2026-05/teambuilding", createdAt: dstr(-11) }),
];

// expose
Object.assign(window, {
  LEVELS, RATE, VIDEO_TYPES, ADDONS, PRIORITIES, STAGES, STAGE_MAP, NORM_HOURS,
  AVATAR_COLORS, SEED_EDITORS, SEED_ORDERS, JOB_TITLES,
  initials, normOf, performance, qualityScore, deadlineScore, kpiScore, perfBand, pct, addonPct,
});
