export interface LoginRequest {
  email: string;
  password: string;
}

export interface LoginResponse {
  accessToken: string;
  refreshToken: string;
  user: UserInfo;
}

export interface RegisterRequest {
  empresa: {
    nombre: string;
    rfc: string;
  };
  usuario: {
    nombre: string;
    email: string;
    password: string;
  };
}

export interface TenantMembership {
  id: string;
  nombre: string;
  rfc: string;
  plan: string;
  role: Role;
  isOwner: boolean;
}

export interface UserInfo {
  id: string;
  email: string;
  nombre: string;
  /** Rol en el tenant ACTIVO (el que resolvió el JWT). */
  role: Role;
  /** Tenant activo (el que resolvió el JWT). */
  tenantId: string;
  tenantName: string;
  tenantRfc: string;
  plan: string;
  platformRoles?: PlatformRole[];
  /**
   * Todos los tenants a los que pertenece este user. Si len > 1, la UI muestra
   * el tenant switcher. Derivado de la tabla tenant_memberships (active=true).
   */
  tenants?: TenantMembership[];
  /**
   * Sesiones acumuladas (login exitoso, no refresh). Driver del auto-dismiss
   * del onboarding tras N logins. La UI lo compara contra el threshold local.
   */
  loginCount?: number;
  /**
   * Si está seteado, el onboarding ya no debe mostrarse en futuros logins.
   * Lo setea el endpoint `/auth/onboarding/dismiss` cuando el user completa
   * todos los pasos requeridos.
   */
  onboardingDismissedAt?: string | Date | null;
}

export interface JWTPayload {
  userId: string;
  email: string;
  role: Role;
  tenantId: string;
  platformRoles?: PlatformRole[];
  /**
   * Version del user al emitir el JWT. Si el user incrementa su tokenVersion
   * (cambio de password, logout-all), todos los JWT con version menor dejan
   * de validar. Default 0 para compat con JWT emitidos antes del rollout.
   */
  tokenVersion?: number;
  iat?: number;
  exp?: number;
}

export type Role = 'owner' | 'cfo' | 'contador' | 'auxiliar' | 'visor' | 'supervisor' | 'cliente';

/**
 * Roles de plataforma (staff interno de Horux 360). Ortogonal al `Role` per-tenant.
 * Un user puede tener 0, 1 o varios.
 *
 * Superset roles (implican todos los otros):
 *   - `platform_admin` — admin global
 *   - `platform_ti` — equipo de TI, mismos permisos que admin. Diferencia semántica para trazabilidad.
 */
export type PlatformRole = 'platform_admin' | 'platform_ti' | 'platform_support' | 'platform_sales' | 'platform_finance';
