import type { SearchableComboboxOption } from "@/components/ui/searchable-combobox"

type MetricEncoding = {
  x?: string
  y?: Array<{ field: string; label?: string }>
  category?: string
  value?: string
  angle?: string
  radius?: string
}

type MetricOptions = {
  legend?: boolean
  tooltip?: boolean
  indicator?: "line" | "dot" | "dashed"
  valueFormatter?: "percent"
}

type MetricAudience = "all" | "agent" | "admin"

export type DashboardMetricDefinition = {
  key: string
  name: string
  description: string
  defaultTitle: string
  recommendedWidget:
    | "kpi"
    | "bar"
    | "line"
    | "area"
    | "pie"
    | "radar"
    | "gauge"
    | "table"
    | "queue-summary"
    | "text"
  keywords?: string[]
  encoding?: MetricEncoding
  columns?: Array<{ field: string; label: string }>
  stacked?: boolean
  options?: MetricOptions
  audience?: MetricAudience
}

export const DASHBOARD_METRIC_DEFINITIONS: DashboardMetricDefinition[] = [
  {
    key: "tickets.opened_resolved_by_day",
    name: "Tickets abertos x resolvidos por dia",
    description:
      "Comparativo diário entre tickets abertos e resolvidos considerando os filtros globais do dashboard.",
    defaultTitle: "Abertos x resolvidos (últimos dias)",
    recommendedWidget: "area",
    encoding: {
      x: "date",
      y: [
        { field: "opened", label: "Abertos" },
        { field: "resolved", label: "Resolvidos" },
      ],
    },
    options: { legend: true, tooltip: true, indicator: "line" },
    keywords: ["linha", "tendência", "evolução", "resolução", "abertos"],
  },
  {
    key: "tickets.waiting_action_now",
    name: "Tickets aguardando ação (agora)",
    description: "Total de tickets abertos que estão aguardando ação neste instante e quantos estão fora do SLA.",
    defaultTitle: "Tickets aguardando ação",
    recommendedWidget: "kpi",
    keywords: ["sla", "pendentes", "agora", "urgente"],
  },
  {
    key: "tickets.waiting_action_last_7d",
    name: "Tickets aguardando ação (últimos 7 dias)",
    description:
      "Volume acumulado de tickets abertos nas últimas 7 noites, com destaque para aqueles em risco de SLA.",
    defaultTitle: "Pendências nos últimos 7 dias",
    recommendedWidget: "kpi",
    keywords: ["tendência", "acumulado", "últimos 7 dias", "sla"],
  },
  {
    key: "tickets.open_by_priority",
    name: "Tickets abertos por prioridade",
    description:
      "Distribuição de tickets abertos segmentada por prioridade durante o período selecionado.",
    defaultTitle: "Abertos por prioridade",
    recommendedWidget: "bar",
    encoding: {
      x: "priority",
      y: [{ field: "total", label: "Tickets" }],
    },
    options: { legend: false, tooltip: true, indicator: "dot" },
    keywords: ["prioridade", "backup", "distribuição"],
  },
  {
    key: "tickets.open_by_queue",
    name: "Tickets abertos por fila",
    description: "Ranking de filas com maior volume de tickets abertos no período filtrado.",
    defaultTitle: "Abertos por fila",
    recommendedWidget: "bar",
    encoding: {
      x: "name",
      y: [{ field: "total", label: "Tickets abertos" }],
    },
    options: { legend: false, tooltip: true, indicator: "dot" },
    keywords: ["fila", "ranking", "operacional"],
  },
  {
    key: "tickets.sla_compliance_by_queue",
    name: "Cumprimento de SLA por fila",
    description: "Percentual de atendimento dentro do SLA por fila com detalhamento de volume total.",
    defaultTitle: "Cumprimento de SLA por fila",
    recommendedWidget: "bar",
    encoding: {
      x: "name",
      y: [{ field: "compliance", label: "Cumprimento (%)" }],
    },
    options: { legend: false, tooltip: true, indicator: "dot", valueFormatter: "percent" },
    keywords: ["sla", "fila", "percentual", "qualidade"],
  },
  {
    key: "queues.summary_cards",
    name: "Resumo por fila (cards)",
    description: "Resumo visual com pendências, andamento e violações de SLA por fila.",
    defaultTitle: "Resumo das filas",
    recommendedWidget: "queue-summary",
    keywords: ["fila", "cards", "pendências", "sla"],
    audience: "admin",
  },
  {
    key: "tickets.sla_rate",
    name: "Taxa geral de cumprimento de SLA",
    description: "Percentual geral de tickets resolvidos dentro do prazo no período filtrado.",
    defaultTitle: "Cumprimento geral de SLA",
    recommendedWidget: "gauge",
    keywords: ["sla", "percentual", "qualidade", "indicador"],
  },
  {
    key: "tickets.awaiting_table",
    name: "Tickets aguardando com detalhes",
    description: "Lista dos principais tickets aguardando ação, incluindo prioridade e responsável.",
    defaultTitle: "Detalhes das pendências",
    recommendedWidget: "table",
    columns: [
      { field: "subject", label: "Assunto" },
      { field: "priority", label: "Prioridade" },
      { field: "status", label: "Status" },
      { field: "updatedAt", label: "Atualizado em" },
    ],
    keywords: ["tabela", "lista", "pendências", "detalhes"],
  },
  {
    key: "agents.self_ticket_status",
    name: "Status dos meus tickets",
    description: "Distribuição entre tickets abertos, pausados e resolvidos do próprio agente no período.",
    defaultTitle: "Status dos meus tickets",
    recommendedWidget: "bar",
    encoding: {
      x: "status",
      y: [{ field: "total", label: "Chamados" }],
    },
    options: { legend: false, tooltip: true, indicator: "dot" },
    keywords: ["agente", "status", "abertos", "resolvidos"],
    audience: "agent",
  },
  {
    key: "agents.self_open_total",
    name: "Meus tickets abertos",
    description: "Quantidade atual de tickets abertos atribuídos ao agente.",
    defaultTitle: "Tickets abertos (meus)",
    recommendedWidget: "kpi",
    keywords: ["agente", "abertos", "backlog"],
    audience: "agent",
  },
  {
    key: "agents.self_paused_total",
    name: "Meus tickets pausados",
    description: "Quantidade de tickets pausados sob responsabilidade do agente.",
    defaultTitle: "Tickets pausados (meus)",
    recommendedWidget: "kpi",
    keywords: ["agente", "pausados"],
    audience: "agent",
  },
  {
    key: "agents.self_resolved_total",
    name: "Tickets resolvidos (meus)",
    description: "Total de tickets resolvidos pelo agente no período selecionado.",
    defaultTitle: "Resolvidos (meus)",
    recommendedWidget: "kpi",
    keywords: ["agente", "resolvidos", "produtividade"],
    audience: "agent",
  },
  {
    key: "agents.self_sla_rate",
    name: "SLA cumprido (meus tickets)",
    description: "Percentual de tickets do agente resolvidos dentro do SLA no período.",
    defaultTitle: "SLA cumprido (meus)",
    recommendedWidget: "gauge",
    options: { valueFormatter: "percent" },
    keywords: ["agente", "sla", "qualidade"],
    audience: "agent",
  },
  {
    key: "agents.self_avg_resolution_minutes",
    name: "Tempo médio de resolução (meus)",
    description: "Tempo médio de resolução, em minutos, dos tickets atribuídos ao agente no período.",
    defaultTitle: "Tempo médio de resolução (meus)",
    recommendedWidget: "kpi",
    keywords: ["agente", "tempo médio", "resolução"],
    audience: "agent",
  },
  {
    key: "agents.team_overview",
    name: "Visão geral por agente",
    description: "Tabela com tickets abertos, pausados, resolvidos, SLA e tempo médio de resolução por agente.",
    defaultTitle: "Visão geral dos agentes",
    recommendedWidget: "table",
    columns: [
      { field: "agentName", label: "Agente" },
      { field: "open", label: "Abertos" },
      { field: "paused", label: "Pausados" },
      { field: "resolved", label: "Resolvidos" },
      { field: "slaRate", label: "SLA (%)" },
      { field: "avgResolutionMinutes", label: "Tempo médio (min)" },
    ],
    keywords: ["agentes", "tabela", "produtividade"],
    audience: "admin",
  },
  {
    key: "agents.team_resolved_total",
    name: "Tickets resolvidos por agente",
    description: "Comparativo de tickets resolvidos por cada agente no período.",
    defaultTitle: "Resolvidos por agente",
    recommendedWidget: "bar",
    encoding: {
      x: "agentName",
      y: [{ field: "resolved", label: "Tickets resolvidos" }],
    },
    options: { legend: false, tooltip: true, indicator: "dot" },
    keywords: ["agentes", "resolvidos", "ranking"],
    audience: "admin",
  },
  {
    key: "agents.team_sla_rate",
    name: "SLA por agente",
    description: "Percentual de cumprimento de SLA para cada agente no período.",
    defaultTitle: "SLA por agente",
    recommendedWidget: "bar",
    encoding: {
      x: "agentName",
      y: [{ field: "compliance", label: "SLA (%)" }],
    },
    options: { legend: false, tooltip: true, indicator: "dot", valueFormatter: "percent" },
    keywords: ["agentes", "sla", "qualidade"],
    audience: "admin",
  },
  {
    key: "agents.team_avg_resolution_minutes",
    name: "Tempo médio por agente",
    description: "Tempo médio de resolução por agente no período.",
    defaultTitle: "Tempo médio por agente",
    recommendedWidget: "bar",
    encoding: {
      x: "agentName",
      y: [{ field: "minutes", label: "Minutos" }],
    },
    options: { legend: false, tooltip: true, indicator: "dot" },
    keywords: ["agentes", "tempo médio", "resolução"],
    audience: "admin",
  },
  {
    key: "devices.health_summary",
    name: "Saúde dos dispositivos",
    description: "Lista os dispositivos monitorados com status, consumo de recursos e alertas recentes.",
    defaultTitle: "Saúde dos dispositivos",
    recommendedWidget: "table",
    columns: [
      { field: "hostname", label: "Hostname" },
      { field: "status", label: "Status" },
      { field: "cpuUsagePercent", label: "CPU (%)" },
      { field: "memoryUsedPercent", label: "Memória (%)" },
      { field: "diskUsedPercent", label: "Disco (%)" },
      { field: "alerts", label: "Alertas" },
    ],
    keywords: ["dispositivos", "hardware", "health"],
    audience: "admin",
  },
]

function normalizeRole(role?: string | null) {
  return role?.toLowerCase() ?? null
}

function canUseMetric(definition: DashboardMetricDefinition, role?: string | null) {
  const audience = definition.audience ?? "all"
  const normalizedRole = normalizeRole(role)
  if (audience === "all") return true
  if (audience === "agent") {
    return normalizedRole === "agent"
  }
  if (audience === "admin") {
    return normalizedRole === "admin" || normalizedRole === "manager"
  }
  return true
}

export function getMetricOptionsForRole(role?: string | null): SearchableComboboxOption[] {
  return DASHBOARD_METRIC_DEFINITIONS.filter((definition) => canUseMetric(definition, role)).map(
    (definition) => ({
      value: definition.key,
      label: definition.name,
      description: definition.description,
      keywords: definition.keywords,
    }),
  )
}

export function getMetricDefinition(metricKey?: string | null): DashboardMetricDefinition | undefined {
  if (!metricKey) return undefined
  const normalized = metricKey.trim().toLowerCase()
  if (!normalized) return undefined
  return DASHBOARD_METRIC_DEFINITIONS.find((definition) => definition.key === normalized)
}
