import type { Allocation } from "@capakraken/shared";
import { fmtDate } from "./timeline-read-shared.js";

export function buildTimelineShiftValidationBookings(
  bookings: Array<{
    id: string;
    resourceId: string | null;
    projectId: string | null;
    startDate: Date;
    endDate: Date;
    hoursPerDay: number;
    status: string;
  }>,
) {
  return bookings
    .filter(
      (
        booking,
      ): booking is typeof booking & { resourceId: string; projectId: string } =>
        booking.resourceId !== null && booking.projectId !== null,
    )
    .map((booking) => ({
      id: booking.id,
      resourceId: booking.resourceId,
      projectId: booking.projectId,
      startDate: booking.startDate,
      endDate: booking.endDate,
      hoursPerDay: booking.hoursPerDay,
      status: booking.status,
    }));
}

export function buildTimelineBudgetStatusAllocations(
  bookings: Array<{
    status: string;
    dailyCostCents: number;
    startDate: Date;
    endDate: Date;
    hoursPerDay: number;
  }>,
): Pick<
  Allocation,
  "status" | "dailyCostCents" | "startDate" | "endDate" | "hoursPerDay"
>[] {
  return bookings.map((booking) => ({
    status: booking.status as Allocation["status"],
    dailyCostCents: booking.dailyCostCents,
    startDate: booking.startDate,
    endDate: booking.endDate,
    hoursPerDay: booking.hoursPerDay,
  }));
}

export function buildTimelineBudgetStatusResponse<TBudgetStatus extends object>(input: {
  project: {
    name: string;
    shortCode: string | null;
    budgetCents: number;
  };
  budgetStatus: TBudgetStatus;
  totalAllocations: number;
}): TBudgetStatus & {
  projectName: string;
  projectCode: string;
  totalAllocations: number;
  budgetCents: number;
} {
  return {
    ...input.budgetStatus,
    projectName: input.project.name,
    projectCode: input.project.shortCode ?? "",
    totalAllocations: input.totalAllocations,
    budgetCents: input.project.budgetCents,
  };
}

export function buildTimelineShiftPreviewDetailResponse<TPreview>(input: {
  project: {
    id: string;
    name: string;
    shortCode: string | null;
    status: string;
    responsiblePerson: string | null;
    startDate: Date;
    endDate: Date;
  };
  requestedShift: {
    newStartDate: Date;
    newEndDate: Date;
  };
  preview: TPreview;
}) {
  return {
    project: {
      id: input.project.id,
      name: input.project.name,
      shortCode: input.project.shortCode,
      status: input.project.status,
      responsiblePerson: input.project.responsiblePerson,
      startDate: fmtDate(input.project.startDate),
      endDate: fmtDate(input.project.endDate),
    },
    requestedShift: {
      newStartDate: fmtDate(input.requestedShift.newStartDate),
      newEndDate: fmtDate(input.requestedShift.newEndDate),
    },
    preview: input.preview,
  };
}
