import { prisma } from "@pmap/database";

const columnsSettingKey = "participant_table_columns";
const defaultParticipantTableColumns = [
  "Reference",
  "Name",
  "Email",
  "Company",
  "Category",
  "Amount",
  "Registration",
  "Payment",
  "QR"
];

type ColumnsSettingValue = {
  columns?: unknown;
};

function normalizeColumns(columns: unknown) {
  const values = Array.isArray(columns) ? columns : defaultParticipantTableColumns;
  const cleaned = values
    .map((column) => typeof column === "string" ? column.trim() : "")
    .filter((column) => defaultParticipantTableColumns.includes(column));
  return Array.from(new Set(cleaned));
}

function readColumns(value: unknown) {
  if (value && typeof value === "object" && "columns" in value) {
    const columns = normalizeColumns((value as ColumnsSettingValue).columns);
    return columns.length > 0 ? columns : defaultParticipantTableColumns;
  }
  return defaultParticipantTableColumns;
}

export function getDefaultParticipantTableColumns() {
  return defaultParticipantTableColumns;
}

export async function getParticipantTableColumns() {
  const setting = await prisma.systemSetting.findFirst({
    where: { conferenceId: null, key: columnsSettingKey }
  });
  return readColumns(setting?.value);
}

export async function saveParticipantTableColumns(columns: string[]) {
  const normalizedColumns = normalizeColumns(columns);
  const selectedColumns = normalizedColumns.length > 0 ? normalizedColumns : defaultParticipantTableColumns;
  const existing = await prisma.systemSetting.findFirst({
    where: { conferenceId: null, key: columnsSettingKey }
  });

  if (existing) {
    await prisma.systemSetting.update({
      where: { id: existing.id },
      data: { value: { columns: selectedColumns } }
    });
  } else {
    await prisma.systemSetting.create({
      data: { key: columnsSettingKey, value: { columns: selectedColumns } }
    });
  }

  return selectedColumns;
}
