import ApiService from "./ApiService";

export interface MisKpiDepartment {
  id: number;
  name: string;
}

export interface MisKpiRow {
  id: string;
  name: string;
  departments: MisKpiDepartment[];
}

export interface MisKpiListParams {
  page?: number;
  limit?: number;
  search?: string;
  department_id?: number;
}

function safeString(value: any, fallback = "-") {
  if (typeof value === "string") {
    const trimmed = value.trim();
    return trimmed.length > 0 ? trimmed : fallback;
  }
  if (typeof value === "number") return String(value);
  return fallback;
}

function normalizeDepartment(item: any): MisKpiDepartment {
  return {
    id: Number(item?.id ?? item?.department_id ?? 0),
    name: safeString(item?.name ?? item?.department_name),
  };
}

function normalizeKpi(item: any): MisKpiRow {
  const departmentsRaw =
    (Array.isArray(item?.departments) && item.departments) ||
    (Array.isArray(item?.department) && item.department) ||
    (item?.department ? [item.department] : []);

  return {
    id: safeString(item?.id),
    name: safeString(item?.name ?? item?.kpi_name),
    departments: departmentsRaw.map(normalizeDepartment),
  };
}

export async function getMisKpiList(params: MisKpiListParams) {
  const response = await ApiService.request<any>({
    url: "/mis/kpis",
    method: "get",
    params: {
      page: params.page ?? 1,
      limit: params.limit ?? 10,
      ...(params.search ? { search: params.search } : {}),
      ...(params.department_id ? { department_id: params.department_id } : {}),
    },
  });

  const payload = response?.data?.data ?? {};
  const rowsRaw =
    (Array.isArray(payload?.data) && payload.data) ||
    (Array.isArray(payload?.rows) && payload.rows) ||
    (Array.isArray(payload) && payload) ||
    [];

  return {
    rows: rowsRaw.map(normalizeKpi),
    total: Number(payload?.count ?? payload?.total ?? payload?.total_count ?? rowsRaw.length),
  };
}

export async function getMisKpiDetails(id: string) {
  const response = await ApiService.request<any>({
    url: `/mis/kpi/${id}`,
    method: "get",
  });

  const payload = response?.data?.data ?? {};
  return normalizeKpi(payload);
}

export async function createMisKpi(payload: { name: string; department_ids: number[] }) {
  return ApiService.request({
    url: "/mis/kpi",
    method: "post",
    data: payload,
  });
}

export async function updateMisKpi(id: string, payload: { name: string; department_ids: number[] }) {
  return ApiService.request({
    url: `/mis/kpi/${id}`,
    method: "put",
    data: payload,
  });
}

