import type {
  ApiProgressReport,
  ProgressReportDeadlineSlot,
  ProgressReportMeetingSlot,
} from "./service/progress-report-service";

export type ProgressReportScheduleRowType = "meeting" | "deadline";
export type ProgressReportScheduleAction =
  | "create"
  | "edit"
  | "blocked"
  | "locked";

export type ProgressReportScheduleRow = {
  id: string;
  resourceId: number | null;
  type: ProgressReportScheduleRowType;
  slot: ProgressReportMeetingSlot | ProgressReportDeadlineSlot;
  nameKey:
    | "firstMeeting"
    | "secondMeeting"
    | "deadline"
    | "firstDeadline"
    | "secondDeadline";
  date: string;
  status: "Draft" | "Sent" | "-";
  rawStatus: "DRAFT" | "SENT" | null;
  action: ProgressReportScheduleAction;
};

function mapStatus(
  status: "DRAFT" | "SENT" | null | undefined,
): "Draft" | "Sent" | "-" {
  if (status === "SENT") return "Sent";
  if (status === "DRAFT") return "Draft";
  return "-";
}

function getAction(
  resource: { status: "DRAFT" | "SENT" } | null,
  canCreate: boolean,
): ProgressReportScheduleAction {
  if (resource?.status === "SENT") return "locked";
  if (resource?.status === "DRAFT") return "edit";
  return canCreate ? "create" : "blocked";
}

export function mapApiProgressReportToScheduleRows(
  report: ApiProgressReport,
): ProgressReportScheduleRow[] {
  const { meetings, deadlines } = report;
  const reportIsSent = report.status === "SENT";
  const firstDeadlineIsSent = deadlines.firstDeadline?.status === "SENT";
  const firstMeetingIsSent = meetings.firstMeeting?.status === "SENT";
  const secondDeadlineIsSent = deadlines.secondDeadline?.status === "SENT";
  const secondMeetingIsSent = meetings.secondMeeting?.status === "SENT";

  return [
    {
      id: "meeting-first",
      resourceId: meetings.firstMeeting?.id ?? null,
      type: "meeting",
      slot: "FIRST",
      nameKey: "firstMeeting",
      date: meetings.firstMeeting?.meetingDate || "-",
      status: mapStatus(meetings.firstMeeting?.status),
      rawStatus: meetings.firstMeeting?.status ?? null,
      action: getAction(
        meetings.firstMeeting,
        reportIsSent && firstDeadlineIsSent,
      ),
    },
    {
      id: "meeting-second",
      resourceId: meetings.secondMeeting?.id ?? null,
      type: "meeting",
      slot: "SECOND",
      nameKey: "secondMeeting",
      date: meetings.secondMeeting?.meetingDate || "-",
      status: mapStatus(meetings.secondMeeting?.status),
      rawStatus: meetings.secondMeeting?.status ?? null,
      action: getAction(
        meetings.secondMeeting,
        reportIsSent && secondDeadlineIsSent,
      ),
    },
    {
      id: "deadline-first",
      resourceId: deadlines.firstDeadline?.id ?? null,
      type: "deadline",
      slot: "FIRST",
      nameKey: "deadline",
      date: deadlines.firstDeadline?.date || "-",
      status: mapStatus(deadlines.firstDeadline?.status),
      rawStatus: deadlines.firstDeadline?.status ?? null,
      action: getAction(deadlines.firstDeadline, false),
    },
    {
      id: "deadline-second",
      resourceId: deadlines.secondDeadline?.id ?? null,
      type: "deadline",
      slot: "SECOND",
      nameKey: "firstDeadline",
      date: deadlines.secondDeadline?.date || "-",
      status: mapStatus(deadlines.secondDeadline?.status),
      rawStatus: deadlines.secondDeadline?.status ?? null,
      action: getAction(
        deadlines.secondDeadline,
        reportIsSent && firstMeetingIsSent,
      ),
    },
    {
      id: "deadline-final",
      resourceId: deadlines.finalDeadline?.id ?? null,
      type: "deadline",
      slot: "FINAL",
      nameKey: "secondDeadline",
      date: deadlines.finalDeadline?.date || "-",
      status: mapStatus(deadlines.finalDeadline?.status),
      rawStatus: deadlines.finalDeadline?.status ?? null,
      action: getAction(
        deadlines.finalDeadline,
        reportIsSent && secondMeetingIsSent,
      ),
    },
  ];
}
