import type { AgentStatus, Status, TaskStatus } from './types'

// =============================================
// Formatadores e utilitários do sistema AD Manager
// =============================================

export function formatDate(dateString: string | null, withTime = true): string {
  if (!dateString) return '—'
  const date = new Date(dateString)
  if (withTime) {
    return date.toLocaleString('pt-BR', {
      day: '2-digit',
      month: '2-digit',
      year: 'numeric',
      hour: '2-digit',
      minute: '2-digit',
    })
  }
  return date.toLocaleDateString('pt-BR', {
    day: '2-digit',
    month: '2-digit',
    year: 'numeric',
  })
}

export function formatRelativeTime(dateString: string | null): string {
  if (!dateString) return 'nunca'
  const date = new Date(dateString)
  const now = new Date()
  const diffMs = now.getTime() - date.getTime()
  const diffMin = Math.floor(diffMs / 60000)
  const diffH = Math.floor(diffMs / 3600000)
  const diffD = Math.floor(diffMs / 86400000)

  if (diffMin < 2) return 'agora mesmo'
  if (diffMin < 60) return `há ${diffMin} min`
  if (diffH < 24) return `há ${diffH}h`
  if (diffD === 1) return 'ontem'
  if (diffD < 30) return `há ${diffD} dias`
  return formatDate(dateString, false)
}

export function getAgentStatusLabel(status: AgentStatus): string {
  const map: Record<AgentStatus, string> = {
    online: 'Online',
    offline: 'Offline',
    warning: 'Atenção',
    unknown: 'Desconhecido',
  }
  return map[status]
}

export function getStatusLabel(status: Status): string {
  const map: Record<Status, string> = {
    active: 'Ativo',
    inactive: 'Inativo',
    pending: 'Pendente',
    blocked: 'Bloqueado',
  }
  return map[status]
}

export function getTaskStatusLabel(status: TaskStatus): string {
  const map: Record<TaskStatus, string> = {
    pending: 'Pendente',
    running: 'Executando',
    success: 'Concluído',
    error: 'Erro',
    cancelled: 'Cancelado',
  }
  return map[status]
}

export function getRoleLabel(role: string): string {
  const map: Record<string, string> = {
    admin_global: 'Admin Global',
    tenant_admin: 'Admin do Tenant',
    tenant_operator: 'Operador',
    tenant_viewer: 'Visualizador',
  }
  return map[role] ?? role
}

export function getActionLabel(action: string): string {
  const map: Record<string, string> = {
    'user.create': 'Criar usuário',
    'user.update': 'Editar usuário',
    'user.disable': 'Inativar usuário',
    'user.enable': 'Ativar usuário',
    'user.reset_password': 'Redefinir senha',
    'user.assign_group': 'Adicionar ao grupo',
    'user.remove_group': 'Remover do grupo',
    'user.clone': 'Clonar usuário',
    'group.create': 'Criar grupo',
    'group.update': 'Editar grupo',
    'group.add_member': 'Adicionar membro',
    'group.remove_member': 'Remover membro',
    'tenant.create': 'Criar tenant',
    'tenant.update': 'Editar tenant',
    'tenant.activate': 'Ativar tenant',
    'tenant.deactivate': 'Desativar tenant',
    'portal_user.create': 'Criar usuário do portal',
    'portal_user.update': 'Editar usuário do portal',
    'portal_user.block': 'Bloquear usuário do portal',
    'agent.generate_token': 'Gerar token do agente',
    'agent.revoke': 'Revogar agente',
    'sync.manual': 'Sincronização manual',
    'sync.auto': 'Sincronização automática',
    'auth.login': 'Login',
    'auth.logout': 'Logout',
    'auth.failed': 'Falha no login',
  }
  return map[action] ?? action
}

/**
 * Gera senha conforme regra do sistema:
 * 1 consoante maiúscula + 1 vogal minúscula + 1 consoante minúscula + 1 vogal minúscula
 * + 4 dígitos sem repetição
 * + 1 caractere especial: ! @ # $
 */
export function generatePassword(): string {
  const upperConsonants = 'BCDFGHJKLMNPQRSTVWXYZ'
  const lowerVowels = 'aeiou'
  const lowerConsonants = 'bcdfghjklmnpqrstvwxyz'
  const specials = '!@#$'

  const rand = (str: string) => str[Math.floor(Math.random() * str.length)]

  // 4 letras
  const letters =
    rand(upperConsonants) +
    rand(lowerVowels) +
    rand(lowerConsonants) +
    rand(lowerVowels)

  // 4 dígitos sem repetição
  const digits = Array.from({ length: 10 }, (_, i) => i)
    .sort(() => Math.random() - 0.5)
    .slice(0, 4)
    .join('')

  // 1 especial
  const special = rand(specials)

  return letters + digits + special
}

/**
 * Sugere UPN baseado no nome e sobrenome
 */
export function suggestUPN(firstName: string, lastName: string, suffix: string): string {
  const normalize = (s: string) =>
    s
      .toLowerCase()
      .normalize('NFD')
      .replace(/[\u0300-\u036f]/g, '')
      .replace(/\s+/g, '.')
      .replace(/[^a-z0-9.]/g, '')

  const first = normalize(firstName.split(' ')[0])
  const last = normalize(lastName.split(' ').pop() ?? lastName)
  return `${first}.${last}@${suffix}`
}
