export interface TicketUserRef {
  id: string;
  name: string;
  email: string;
}

export interface TicketStatusRef {
  id: string;
  name_en: string;
  name_ar: string;
  color: string;
  is_closed: boolean;
}

export interface TicketPriorityRef {
  id: string;
  name_en: string;
  name_ar: string;
  color: string;
  sort_order: number;
}

export interface TicketCategoryRef {
  id: string;
  name_en: string;
  name_ar: string;
}

export interface TicketDepartmentRef {
  id: string;
  name: string;
  code: string;
}

export interface TicketSummary {
  id: string;
  ticket_number: string;
  ticket_type?: string;
  is_project_work_item?: boolean;
  project_id?: string | null;
  subject: string;
  description: string;
  department: TicketDepartmentRef;
  requester: TicketUserRef;
  assignee?: TicketUserRef | null;
  status: TicketStatusRef;
  priority: TicketPriorityRef;
  category?: TicketCategoryRef | null;
  subcategory?: TicketCategoryRef | null;
  first_response_at: string | null;
  resolved_at: string | null;
  closed_at: string | null;
  created_at: string;
  updated_at: string;
  age_in_days: number;
  is_assigned: boolean;
  is_open: boolean;
}

export interface TicketAssignmentEntry {
  id: string;
  assigned_by: { id: string; name: string };
  assigned_to: { id: string; name: string };
  notes: string | null;
  created_at: string;
}

export interface TicketStatusHistoryEntry {
  id: string;
  changed_by: { id: string; name: string };
  from_status: TicketStatusRef | null;
  to_status: TicketStatusRef;
  notes: string | null;
  created_at: string;
}

export interface TicketDetail extends TicketSummary {
  assignments?: TicketAssignmentEntry[];
  status_history?: TicketStatusHistoryEntry[];
  collaborators?: import('@/features/tickets/types/collaborator.types').TicketCollaborator[];
  collaborator_activity?: import('@/features/tickets/types/collaborator.types').TicketCollaboratorActivityEntry[];
  time_to_first_response_minutes: number | null;
  time_to_resolution_minutes: number | null;
}

export interface TicketReply {
  id: string;
  ticket_id: string;
  user: TicketUserRef;
  content: string;
  is_solution: boolean;
  attachments?: TicketAttachment[];
  created_at: string;
  updated_at: string;
}

export interface TicketNote {
  id: string;
  ticket_id: string;
  user: TicketUserRef;
  content: string;
  is_pinned: boolean;
  attachments?: TicketAttachment[];
  created_at: string;
  updated_at: string;
}

export interface TicketAttachment {
  id: string;
  file_name: string;
  file_size: number;
  mime_type: string;
  formatted_size?: string;
  url?: string;
  download_url?: string;
}

export interface CreateTicketPayload {
  department_id: string;
  subject: string;
  description: string;
  category_id?: string;
  subcategory_id?: string;
  priority_id?: string;
  assignee_id?: string;
}

export interface TicketListFilters {
  page?: number;
  per_page?: number;
  search?: string;
  status_id?: string;
  priority_id?: string;
  assignee_id?: string;
  unassigned_only?: boolean;
  open_only?: boolean;
  sort_by?: string;
  sort_order?: 'asc' | 'desc';
}

export interface UpdateTicketPayload {
  subject?: string;
  description?: string;
  status_id?: string;
  priority_id?: string;
  category_id?: string | null;
  subcategory_id?: string | null;
}

export interface AssignTicketPayload {
  assignee_id: string;
  notes?: string;
}

function isUserRef(value: unknown): value is TicketUserRef {
  if (typeof value !== 'object' || value === null) {
    return false;
  }
  const u = value as Record<string, unknown>;
  return typeof u.id === 'string' && typeof u.name === 'string' && typeof u.email === 'string';
}

function isStatusRef(value: unknown): value is TicketStatusRef {
  if (typeof value !== 'object' || value === null) {
    return false;
  }
  const s = value as Record<string, unknown>;
  return (
    typeof s.id === 'string' &&
    typeof s.name_en === 'string' &&
    typeof s.name_ar === 'string' &&
    typeof s.is_closed === 'boolean'
  );
}

function isPriorityRef(value: unknown): value is TicketPriorityRef {
  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' && typeof p.name_ar === 'string';
}

export function isTicketSummary(value: unknown): value is TicketSummary {
  if (typeof value !== 'object' || value === null) {
    return false;
  }
  const t = value as Record<string, unknown>;
  return (
    typeof t.id === 'string' &&
    typeof t.ticket_number === 'string' &&
    typeof t.subject === 'string' &&
    isStatusRef(t.status) &&
    isPriorityRef(t.priority) &&
    isUserRef(t.requester)
  );
}

export function isTicketDetail(value: unknown): value is TicketDetail {
  return isTicketSummary(value);
}

export function isTicketAttachment(value: unknown): value is TicketAttachment {
  if (typeof value !== 'object' || value === null) {
    return false;
  }
  const a = value as Record<string, unknown>;
  return (
    typeof a.id === 'string' &&
    typeof a.file_name === 'string' &&
    typeof a.file_size === 'number'
  );
}

export function isTicketReply(value: unknown): value is TicketReply {
  if (typeof value !== 'object' || value === null) {
    return false;
  }
  const r = value as Record<string, unknown>;
  return (
    typeof r.id === 'string' &&
    typeof r.content === 'string' &&
    isUserRef(r.user)
  );
}

export function isTicketNote(value: unknown): value is TicketNote {
  if (typeof value !== 'object' || value === null) {
    return false;
  }
  const n = value as Record<string, unknown>;
  return (
    typeof n.id === 'string' &&
    typeof n.content === 'string' &&
    typeof n.is_pinned === 'boolean' &&
    isUserRef(n.user)
  );
}

export function unwrapResource<T>(
  raw: unknown,
  guard: (value: unknown) => value is T,
): T {
  if (guard(raw)) {
    return raw;
  }

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

  throw new Error('Invalid API response shape');
}
