import type { IssueMatrixRow } from "./issue-matrix-data";
import { issueMatrixText, type IssueMatrixLanguage } from "./issue-matrix-i18n";

export type IssueMatrixColumn = {
  key: keyof IssueMatrixRow;
  label: string;
  width: string;
  isLink?: boolean;
};

const ISSUE_MATRIX_COLUMN_BASE: Omit<IssueMatrixColumn, "label">[] = [
  { key: "id", width: "70px" },
  { key: "workingGroup", width: "240px" },
  { key: "issue", width: "300px" },
  { key: "category", width: "180px" },
  { key: "issueDescription", width: "400px" },
  { key: "recommendation", width: "400px" },
  { key: "governmentDecision", width: "420px" },
  { key: "status", width: "160px" },
  { key: "plenaryEscalation", width: "200px" },
  { key: "dateOfSolution", width: "190px" },
  { key: "primaryAgency", width: "180px" },
  { key: "meetingType", width: "180px" },
  { key: "wgMeetingDate", width: "190px" },
  { key: "secondAgency", width: "180px" },
  { key: "thirdAgency", width: "180px" },
  { key: "fourthAgency", width: "180px" },
  { key: "fifthAgency", width: "180px" },
  { key: "indicator", width: "340px" },
  { key: "sourceOfVerification", width: "280px" },
  {
    key: "verificationLink",
    width: "260px",
    isLink: true,
  },
  {
    key: "action",
    width: "120px",
    isLink: true,
  },
];

export function getIssueMatrixColumns(
  language: IssueMatrixLanguage,
  options?: {
    includePlenaryEscalation?: boolean;
    placeDateOfSolutionAfterPrimaryAgency?: boolean;
  },
): IssueMatrixColumn[] {
  let columns = ISSUE_MATRIX_COLUMN_BASE.map((column) => ({
    ...column,
    label:
      issueMatrixText[language].columns[column.key] ??
      issueMatrixText.en.columns[column.key] ??
      String(column.key),
  }));

  if (!options?.includePlenaryEscalation) {
    columns = columns.filter((column) => column.key !== "plenaryEscalation");
  }

  if (!options?.placeDateOfSolutionAfterPrimaryAgency) {
    return columns;
  }

  const dateOfSolutionIndex = columns.findIndex(
    (column) => column.key === "dateOfSolution",
  );
  const primaryAgencyIndex = columns.findIndex(
    (column) => column.key === "primaryAgency",
  );

  if (
    dateOfSolutionIndex < 0 ||
    primaryAgencyIndex < 0 ||
    dateOfSolutionIndex === primaryAgencyIndex + 1
  ) {
    return columns;
  }

  const [dateOfSolutionColumn] = columns.splice(dateOfSolutionIndex, 1);
  const nextPrimaryAgencyIndex = columns.findIndex(
    (column) => column.key === "primaryAgency",
  );
  columns.splice(nextPrimaryAgencyIndex + 1, 0, dateOfSolutionColumn);

  return columns;
}
