import { API_ENDPOINTS } from '@/shared/constants/apiEndpoints';
import { api } from '@/shared/utils/api';
import { isPaginatedResponse } from '@/shared/types/pagination.types';
import type { CategoryRecord, SubcategoryRecord } from '@/features/admin/types/admin.types';

function isCategoryRecord(value: unknown): value is CategoryRecord {
  if (typeof value !== 'object' || value === null) {
    return false;
  }
  const c = value as Record<string, unknown>;
  return typeof c.id === 'string' && typeof c.name_en === 'string';
}

function unwrapCategories(raw: unknown): CategoryRecord[] {
  if (isPaginatedResponse(raw, isCategoryRecord)) {
    return raw.data;
  }
  if (typeof raw === 'object' && raw !== null && 'data' in raw) {
    const data = (raw as { data: unknown }).data;
    if (Array.isArray(data) && data.every(isCategoryRecord)) {
      return data;
    }
  }
  if (Array.isArray(raw) && raw.every(isCategoryRecord)) {
    return raw;
  }
  return [];
}

function unwrapCategory(raw: unknown): CategoryRecord {
  if (isCategoryRecord(raw)) {
    return raw;
  }
  if (typeof raw === 'object' && raw !== null && 'data' in raw) {
    const data = (raw as { data: unknown }).data;
    if (isCategoryRecord(data)) {
      return data;
    }
  }
  throw new Error('Invalid category response');
}

export async function listCategories(departmentId: string): Promise<CategoryRecord[]> {
  const raw: unknown = await api.get(
    `${API_ENDPOINTS.CATEGORIES.LIST}?department_id=${encodeURIComponent(departmentId)}&paginate=0`,
  );
  return unwrapCategories(raw);
}

export async function createCategory(payload: {
  department_id: string;
  name_en: string;
  name_ar: string;
  sla_policy_id?: string | null;
  is_active?: boolean;
  sort_order?: number;
}): Promise<CategoryRecord> {
  const raw: unknown = await api.post(API_ENDPOINTS.CATEGORIES.CREATE, payload);
  return unwrapCategory(raw);
}

export async function updateCategory(
  id: string,
  payload: Partial<CategoryRecord>,
): Promise<CategoryRecord> {
  const raw: unknown = await api.patch(API_ENDPOINTS.CATEGORIES.UPDATE(id), payload);
  return unwrapCategory(raw);
}

export async function deleteCategory(id: string): Promise<void> {
  await api.delete(API_ENDPOINTS.CATEGORIES.DELETE(id));
}

export async function createSubcategory(
  categoryId: string,
  payload: {
    name_en: string;
    name_ar: string;
    sla_policy_id?: string | null;
    is_active?: boolean;
    sort_order?: number;
  },
): Promise<SubcategoryRecord> {
  const raw: unknown = await api.post(API_ENDPOINTS.CATEGORIES.SUBCATEGORIES(categoryId), payload);
  if (typeof raw === 'object' && raw !== null && 'data' in raw) {
    return (raw as { data: SubcategoryRecord }).data;
  }
  return raw as SubcategoryRecord;
}

export async function updateSubcategory(
  id: string,
  payload: Partial<{
    name_en: string;
    name_ar: string;
    is_active: boolean;
    sort_order: number;
    sla_policy_id: string | null;
  }>,
): Promise<SubcategoryRecord> {
  const raw: unknown = await api.patch(API_ENDPOINTS.SUBCATEGORIES.UPDATE(id), payload);
  if (typeof raw === 'object' && raw !== null && 'data' in raw) {
    return (raw as { data: SubcategoryRecord }).data;
  }
  return raw as SubcategoryRecord;
}

export async function deleteSubcategory(id: string): Promise<void> {
  await api.delete(API_ENDPOINTS.SUBCATEGORIES.DELETE(id));
}
