import { MasterUser } from './master-user.dto';

export interface PaginatedResponse<T> {
  data: T[];
  pagination: {
    currentPage: number;
    perPage: number;
    total: number;
    lastPage: number;
  };
}

interface LaravelPaginatorMeta {
  current_page?: number;
  per_page?: number;
  total?: number;
  last_page?: number;
}

interface LaravelPaginatedPayload<T> {
  data: T[];
  meta?: LaravelPaginatorMeta;
}

export function fromLaravelPaginator<T, R>(
  payload: LaravelPaginatedPayload<T>,
  mapItem: (item: T) => R,
): PaginatedResponse<R> {
  const meta = payload.meta ?? {};
  return {
    data: (payload.data ?? []).map(mapItem),
    pagination: {
      currentPage: meta.current_page ?? 1,
      perPage: meta.per_page ?? 0,
      total: meta.total ?? 0,
      lastPage: meta.last_page ?? 1,
    },
  };
}

/** Resposta bruta de um item de usuário na API Laravel (master/users). */
export interface LaravelMasterUserRow {
  uuid: string;
  name: string;
  first_name: string;
  last_name: string;
  email: string;
  email_verified_at: string | null;
  phone_country_code: string | null;
  phone: string | null;
  phone_is_whatsapp: boolean | number | string | null;
  whatsapp: string | null;
  whatsapp_country_code: string | null;
  business_name: string | null;
  business_subdomain: string | null;
  created_at: string;
  updated_at: string;
}

export function mapLaravelMasterUser(row: LaravelMasterUserRow): MasterUser {
  return {
    uuid: row.uuid,
    name: row.name,
    firstName: row.first_name,
    lastName: row.last_name,
    email: row.email,
    emailVerifiedAt: row.email_verified_at,
    phone: row.phone ?? null,
    phoneCountryCode: row.phone_country_code ?? null,
    phoneIsWhatsapp: mapNullableBoolean(row.phone_is_whatsapp),
    whatsapp: row.whatsapp ?? null,
    whatsappCountryCode: row.whatsapp_country_code ?? null,
    businessName: row.business_name ?? null,
    businessSubdomain: row.business_subdomain ?? null,
    createdAt: row.created_at,
    updatedAt: row.updated_at,
  };
}

function mapNullableBoolean(
  value: boolean | number | string | null | undefined,
): boolean | null {
  if (value === null || value === undefined) {
    return null;
  }
  if (typeof value === 'boolean') {
    return value;
  }
  if (typeof value === 'number') {
    return value !== 0;
  }

  const normalized = value.trim().toLowerCase();
  if (normalized === '1' || normalized === 'true') {
    return true;
  }
  if (normalized === '0' || normalized === 'false' || normalized === '') {
    return false;
  }
  return Boolean(normalized);
}
