/** Kolom Kanban laporan harian (tersimpan di `reports.body` sebagai JSON). */
export type ReportKanbanColumn = "todo" | "doing" | "done";

export type ReportKanbanTask = {
  id: string;
  title: string;
  column: ReportKanbanColumn;
};

export type ReportAttachment = {
  id: string;
  url: string;
  name: string;
  mimeType: string;
  size: number;
};

export const REPORT_BODY_SCHEMA = "workpulse.report.v1" as const;

export const MAX_REPORT_ATTACHMENTS = 10;

export type ReportBodyPayloadV1 = {
  schema: typeof REPORT_BODY_SCHEMA;
  /** Ringkasan untuk tampilan lama / ekspor cepat; bisa disinkron dari workStart + workEnd. */
  workHours: string;
  /** Jam mulai & selesai kerja (format `HH:MM`, 24 jam), opsional. */
  workStart?: string;
  workEnd?: string;
  /** Deskripsi pekerjaan — apa yang dikerjakan hari itu. */
  workDescription: string;
  /** Legacy — hanya untuk baca laporan lama. */
  blockers: string;
  tomorrow: string;
  tasks: ReportKanbanTask[];
  /** Screenshot / bukti kerjaan (disimpan di server, URL relatif). */
  attachments?: ReportAttachment[];
};

export function emptyPayload(): ReportBodyPayloadV1 {
  return {
    schema: REPORT_BODY_SCHEMA,
    workHours: "",
    workStart: "",
    workEnd: "",
    workDescription: "",
    blockers: "",
    tomorrow: "",
    tasks: [],
    attachments: []
  };
}

function parseAttachments(raw: unknown): ReportAttachment[] {
  if (!Array.isArray(raw)) return [];
  const out: ReportAttachment[] = [];
  for (const x of raw) {
    if (!x || typeof x !== "object") continue;
    const r = x as Record<string, unknown>;
    const id = typeof r.id === "string" ? r.id : "";
    const url = typeof r.url === "string" ? r.url : "";
    const name = typeof r.name === "string" ? r.name : "";
    const mimeType = typeof r.mimeType === "string" ? r.mimeType : "";
    const size = typeof r.size === "number" ? r.size : 0;
    if (id && url) out.push({ id, url, name, mimeType, size });
  }
  return out;
}

/** Teks deskripsi untuk tampilan: field baru, atau gabungan data lama. */
export function readWorkDescription(p: ReportBodyPayloadV1 | null): string {
  if (!p) return "";
  const d = (p.workDescription || "").trim();
  if (d) return d;
  const parts: string[] = [];
  const b = (p.blockers || "").trim();
  const t = (p.tomorrow || "").trim();
  if (b) parts.push(b);
  if (t) parts.push(t);
  return parts.join("\n\n");
}

export function parseReportBody(raw: string | null | undefined): ReportBodyPayloadV1 | null {
  if (!raw || !String(raw).trim()) return null;
  const t = String(raw).trim();
  if (!t.startsWith("{")) return null;
  try {
    const o = JSON.parse(t) as Record<string, unknown>;
    if (o.schema !== REPORT_BODY_SCHEMA || !Array.isArray(o.tasks)) return null;
    const tasks: ReportKanbanTask[] = [];
    for (const x of o.tasks as unknown[]) {
      if (!x || typeof x !== "object") continue;
      const r = x as Record<string, unknown>;
      const id = typeof r.id === "string" ? r.id : "";
      const title = typeof r.title === "string" ? r.title : "";
      const col = r.column === "todo" || r.column === "doing" || r.column === "done" ? r.column : "todo";
      if (id && title) tasks.push({ id, title, column: col });
    }
    return {
      schema: REPORT_BODY_SCHEMA,
      workHours: typeof o.workHours === "string" ? o.workHours : "",
      workStart: typeof o.workStart === "string" ? o.workStart : "",
      workEnd: typeof o.workEnd === "string" ? o.workEnd : "",
      workDescription: typeof o.workDescription === "string" ? o.workDescription : "",
      blockers: typeof o.blockers === "string" ? o.blockers : "",
      tomorrow: typeof o.tomorrow === "string" ? o.tomorrow : "",
      tasks,
      attachments: parseAttachments(o.attachments)
    };
  } catch {
    return null;
  }
}

export function stringifyReportBody(p: ReportBodyPayloadV1): string {
  const base: Record<string, unknown> = {
    schema: REPORT_BODY_SCHEMA,
    workHours: p.workHours,
    workStart: p.workStart ?? "",
    workEnd: p.workEnd ?? "",
    workDescription: p.workDescription ?? "",
    blockers: "",
    tomorrow: "",
    tasks: p.tasks.map((t) => ({ id: t.id, title: t.title, column: t.column }))
  };
  const atts = p.attachments ?? [];
  if (atts.length) {
    base.attachments = atts.map((a) => ({
      id: a.id,
      url: a.url,
      name: a.name,
      mimeType: a.mimeType,
      size: a.size
    }));
  }
  return JSON.stringify(base);
}

/** Sinkronkan `workHours` dari pasangan jam (untuk kompatibilitas & ringkasan). */
export function formatWorkHoursRange(start: string, end: string): string {
  const a = (start || "").trim();
  const b = (end || "").trim();
  if (a && b) return `${a} - ${b}`;
  return a || b || "";
}

/** Coba isi workStart/workEnd dari string "HH:MM - HH:MM". */
export function parseWorkHoursRange(workHours: string): { start: string; end: string } {
  const t = (workHours || "").trim();
  const parts = t.split(/\s*-\s*/);
  if (parts.length >= 2) {
    return { start: parts[0].trim(), end: parts.slice(1).join("-").trim() };
  }
  return { start: "", end: "" };
}

export function newTaskId(): string {
  if (typeof crypto !== "undefined" && "randomUUID" in crypto) return crypto.randomUUID();
  return `t-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
}
