import type { ProgressReportRow as SharedProgressReportRow } from "@/features/ministry/progress-report/progress-report-data";
import type { ProgressReportSemester } from "@/features/ministry/progress-report/service/progress-report-service";

export type ProgressReportOption = {
  label: string;
  value: string;
};

export type ProgressReportFiltersValue = {
  year: string;
  semesters: string[];
  statuses: string[];
};

export type ProgressReportRow = SharedProgressReportRow & {
  semester: ProgressReportSemester;
};

export const defaultProgressReportFilters: ProgressReportFiltersValue = {
  year: "",
  semesters: [],
  statuses: [],
};

export function filterProgressReportRows(
  rows: ProgressReportRow[],
  filters: ProgressReportFiltersValue,
) {
  return rows.filter((row) => {
    const matchesYear = !filters.year || row.year === filters.year;
    const matchesSemester =
      filters.semesters.length === 0 ||
      filters.semesters.includes(row.semester);
    const matchesStatus =
      filters.statuses.length === 0 || filters.statuses.includes(row.status);

    return matchesYear && matchesSemester && matchesStatus;
  });
}

export function getProgressReportFilterOptions(rows: ProgressReportRow[]) {
  const years = Array.from(new Set(rows.map((row) => row.year))).sort(
    (first, second) => Number(second) - Number(first),
  );
  const statuses = Array.from(new Set(rows.map((row) => row.status))).sort();

  return {
    years: years.map((year) => ({ label: year, value: year })),
    semesters: [
      { label: "S1", value: "S1" },
      { label: "S2", value: "S2" },
    ],
    statuses: statuses.map((status) => ({ label: status, value: status })),
  } satisfies Record<string, ProgressReportOption[]>;
}
