import { API_ENDPOINTS } from '@/shared/constants/apiEndpoints';
import { api } from '@/shared/utils/api';
import {
  fetchDepartmentAssignableUsers,
  fetchTicketFormOptions,
} from '@/features/tickets/services/departmentSupportService';

export interface AssigneePerformanceRow {
  assignee_id: string;
  assignee_name: string;
  assignee_email: string;
  tickets_handled: number;
  tickets_closed: number;
}

/** @deprecated Use AssigneePerformanceRow */
export type AgentPerformanceRow = AssigneePerformanceRow;

export interface SlaPolicyDepartmentSummary {
  id: string;
  name: string;
  code: string;
  company_id?: string;
  company?: { id: string; name: string } | null;
}

export interface SlaPolicySummary {
  id: string;
  department_id?: string;
  department_ids?: string[];
  name_en: string;
  name_ar: string;
  is_active: boolean;
  response_time_minutes: number;
  resolution_time_minutes: number;
  department?: { id: string; name: string; code: string };
  departments?: SlaPolicyDepartmentSummary[];
}

function normalizeAssigneePerformanceRow(value: Record<string, unknown>): AssigneePerformanceRow | null {
  const assigneeId =
    typeof value.assignee_id === 'string'
      ? value.assignee_id
      : typeof value.user_id === 'string'
        ? value.user_id
        : typeof value.agent_id === 'string'
          ? value.agent_id
          : null;

  const assigneeName =
    typeof value.assignee_name === 'string'
      ? value.assignee_name
      : typeof value.user_name === 'string'
        ? value.user_name
        : typeof value.agent_name === 'string'
          ? value.agent_name
          : null;

  const assigneeEmail =
    typeof value.assignee_email === 'string'
      ? value.assignee_email
      : typeof value.user_email === 'string'
        ? value.user_email
        : typeof value.agent_email === 'string'
          ? value.agent_email
          : null;

  if (
    assigneeId === null ||
    assigneeName === null ||
    assigneeEmail === null ||
    typeof value.tickets_handled !== 'number' ||
    typeof value.tickets_closed !== 'number'
  ) {
    return null;
  }

  return {
    assignee_id: assigneeId,
    assignee_name: assigneeName,
    assignee_email: assigneeEmail,
    tickets_handled: value.tickets_handled,
    tickets_closed: value.tickets_closed,
  };
}

function parseAssigneePerformancePayload(value: unknown): AssigneePerformanceRow[] {
  if (typeof value !== 'object' || value === null) {
    return [];
  }

  const record = value as Record<string, unknown>;
  const rows = record.assignees ?? record.agents;

  if (!Array.isArray(rows)) {
    return [];
  }

  return rows
    .map((row) =>
      typeof row === 'object' && row !== null
        ? normalizeAssigneePerformanceRow(row as Record<string, unknown>)
        : null,
    )
    .filter((row): row is AssigneePerformanceRow => row !== null);
}

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

export async function fetchAssigneePerformance(): Promise<AssigneePerformanceRow[]> {
  const raw: unknown = await api.get(API_ENDPOINTS.DASHBOARD.ASSIGNEE_PERFORMANCE);
  const parsed = parseAssigneePerformancePayload(raw);
  if (parsed.length > 0 || (typeof raw === 'object' && raw !== null)) {
    return parsed;
  }

  if (typeof raw === 'object' && raw !== null && 'data' in raw) {
    return parseAssigneePerformancePayload((raw as { data: unknown }).data);
  }

  return [];
}

/** @deprecated Use fetchAssigneePerformance */
export async function fetchAgentPerformance(): Promise<AssigneePerformanceRow[]> {
  return fetchAssigneePerformance();
}

export async function createSlaPolicy(payload: Record<string, unknown>): Promise<SlaPolicySummary> {
  const raw: unknown = await api.post(API_ENDPOINTS.SLA_POLICIES.CREATE, payload);
  return unwrapSlaPolicy(raw);
}

export async function updateSlaPolicy(
  id: string,
  payload: Record<string, unknown>,
): Promise<SlaPolicySummary> {
  const raw: unknown = await api.patch(API_ENDPOINTS.SLA_POLICIES.UPDATE(id), payload);
  return unwrapSlaPolicy(raw);
}

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

function unwrapSlaPolicy(raw: unknown): SlaPolicySummary {
  if (isSlaPolicySummary(raw)) {
    return raw;
  }
  if (typeof raw === 'object' && raw !== null && 'data' in raw) {
    const data = (raw as { data: unknown }).data;
    if (isSlaPolicySummary(data)) {
      return data;
    }
  }
  throw new Error('Invalid SLA policy response');
}

export async function fetchSlaPolicies(departmentId?: string): Promise<SlaPolicySummary[]> {
  const query = departmentId ? `?department_id=${encodeURIComponent(departmentId)}` : '';
  const raw: unknown = await api.get(`${API_ENDPOINTS.SLA_POLICIES.LIST}${query}`);

  if (Array.isArray(raw) && raw.every(isSlaPolicySummary)) {
    return raw;
  }

  if (typeof raw === 'object' && raw !== null && 'data' in raw) {
    const data = (raw as { data: unknown }).data;
    if (Array.isArray(data) && data.every(isSlaPolicySummary)) {
      return data;
    }
  }

  return [];
}

export {
  fetchDepartmentAssignableUsers,
  fetchDepartmentAssignableUsers as fetchDepartmentAgents,
  fetchTicketFormOptions,
};
