import {
  mysqlTable,
  varchar,
  int,
  boolean,
  timestamp,
  text,
  mysqlEnum,
  date,
} from "drizzle-orm/mysql-core";

// ─────────────────────────────────────────────────────────────
// users — instância própria da Biblioteca (sem SSO ainda).
// Estrutura de papéis espelha o SpotOnFide de propósito: quando o
// HUB-INTEGRATION-POINT (login único) existir, ligar as duas contas
// é trabalho de integração, não de reescrita de schema.
// ─────────────────────────────────────────────────────────────
export const users = mysqlTable("users", {
  id: int("id").autoincrement().primaryKey(),
  nome: varchar("nome", { length: 191 }).notNull(),
  email: varchar("email", { length: 191 }).notNull().unique(),
  senhaHash: varchar("senha_hash", { length: 191 }).notNull(),
  papel: mysqlEnum("papel", ["user", "admin", "editor"]).notNull().default("user"),
  criadoEm: timestamp("criado_em").defaultNow().notNull(),
});

// ─────────────────────────────────────────────────────────────
// biblioteca_livros — domínio próprio (ADR-003: nunca reaproveitar
// tabelas de outro módulo/plataforma).
// ─────────────────────────────────────────────────────────────
export const bibliotecaLivros = mysqlTable("biblioteca_livros", {
  id: int("id").autoincrement().primaryKey(),
  titulo: varchar("titulo", { length: 255 }).notNull(),
  subtitulo: varchar("subtitulo", { length: 255 }),
  serie: varchar("serie", { length: 191 }), // ex: "Quatro Cavalos"
  volumeNumero: int("volume_numero"),
  autor: varchar("autor", { length: 191 }).notNull(),
  resumo: text("resumo"),
  capaUrl: varchar("capa_url", { length: 500 }),
  epubUrl: varchar("epub_url", { length: 500 }),
  docxOriginalUrl: varchar("docx_original_url", { length: 500 }),

  // HUB-INTEGRATION-POINT: hoje sempre "gratuito". Quando o HUB tiver
  // o gateway de assinatura funcionando, ele passa a popular/aplicar
  // este campo — a Biblioteca só lê, nunca decide sozinha.
  nivelAcesso: mysqlEnum("nivel_acesso", ["gratuito", "assinante"])
    .notNull()
    .default("gratuito"),

  // Plano futuro: "audiolivro" ainda não implementado. Os demais formatos
  // ilustrados/imagem (manga/hq/ilustrado) usam biblioteca_paginas em vez
  // de epubUrl — o leitor escolhe qual motor usar com base neste campo.
  formato: mysqlEnum("formato", ["texto", "ilustrado", "manga", "hq", "revista", "apostila", "audiolivro"])
    .notNull()
    .default("texto"),

  // Camada 1 da taxonomia (público-alvo). Nullable = "toda a família".
  publicoAlvo: mysqlEnum("publico_alvo", [
    "primeiros_leitores",
    "infantil",
    "pre_adolescente",
    "adolescente",
    "jovem",
    "adulto",
  ]),

  // Camada 4 — coleção temática (ex: "Heróis da Fé"). Diferente de série:
  // uma coleção pode reunir séries inteiras ou obras avulsas, sem ordem
  // sequencial obrigatória. Série continua sendo o campo `serie` acima,
  // que agora é interpretado como "série dentro da coleção".
  colecaoId: int("colecao_id"),

  status: mysqlEnum("status", ["rascunho", "publicado"]).notNull().default("rascunho"),
  destaque: boolean("destaque").notNull().default(false), // marcado pelo editor pra entrar no carrossel do hero

  // Link externo pra compra do livro impresso (loja de terceiros —
  // a Biblioteca nunca processa pagamento, só aponta pra fora).
  linkCompraImpresso: varchar("link_compra_impresso", { length: 500 }),

  // Contador denormalizado pra exibição rápida (evita contar linhas
  // toda vez que a ficha carrega). A dedução de acesso "único" de
  // verdade mora em biblioteca_acesso_registros, abaixo.
  contagemAcessos: int("contagem_acessos").notNull().default(0),

  criadoPor: int("criado_por").notNull(), // FK -> users.id (editor/admin)
  criadoEm: timestamp("criado_em").defaultNow().notNull(),
  atualizadoEm: timestamp("atualizado_em").defaultNow().onUpdateNow().notNull(),
});

// ─────────────────────────────────────────────────────────────
// Biblioteca pessoal do leitor
// ─────────────────────────────────────────────────────────────
export const bibliotecaFavoritos = mysqlTable("biblioteca_favoritos", {
  id: int("id").autoincrement().primaryKey(),
  userId: int("user_id").notNull(),
  livroId: int("livro_id").notNull(),
  criadoEm: timestamp("criado_em").defaultNow().notNull(),
});

export const bibliotecaHistorico = mysqlTable("biblioteca_historico", {
  id: int("id").autoincrement().primaryKey(),
  userId: int("user_id").notNull(),
  livroId: int("livro_id").notNull(),
  posicaoLeitura: varchar("posicao_leitura", { length: 500 }), // CFI do epub.js
  atualizadoEm: timestamp("atualizado_em").defaultNow().onUpdateNow().notNull(),
});

// ─────────────────────────────────────────────────────────────
// biblioteca_anotacoes — uma única tabela pra marca-página, grifo e
// trecho compartilhável (mesma peça técnica de base: CFI + texto).
// ─────────────────────────────────────────────────────────────
export const bibliotecaAnotacoes = mysqlTable("biblioteca_anotacoes", {
  id: int("id").autoincrement().primaryKey(),
  userId: int("user_id").notNull(),
  livroId: int("livro_id").notNull(),
  tipo: mysqlEnum("tipo", ["marcador", "grifo", "compartilhamento"]).notNull(),
  cfiInicio: varchar("cfi_inicio", { length: 500 }).notNull(),
  cfiFim: varchar("cfi_fim", { length: 500 }), // vazio pra marcador simples
  trechoTexto: text("trecho_texto"), // cópia do texto no momento do grifo/share
  notaLeitor: varchar("nota_leitor", { length: 500 }),
  publico: boolean("publico").notNull().default(false), // true = tem link de share
  criadoEm: timestamp("criado_em").defaultNow().notNull(),
});

// ─────────────────────────────────────────────────────────────
// biblioteca_config — configuração de exibição (registro único).
// Colunas de desktop/tablet são configuráveis pelo editor; mobile
// nunca usa esse número — sempre se ajusta sozinho ao tamanho da
// tela (grade auto-fill), por decisão de UX.
// ─────────────────────────────────────────────────────────────
export const bibliotecaConfig = mysqlTable("biblioteca_config", {
  id: int("id").autoincrement().primaryKey(),
  colunasDesktop: int("colunas_desktop").notNull().default(4),
  colunasTablet: int("colunas_tablet").notNull().default(2),
  modoPadrao: mysqlEnum("modo_padrao", ["grade", "lista"]).notNull().default("grade"),
  qtdSlidesHero: int("qtd_slides_hero").notNull().default(5), // quantos livros aparecem no carrossel
  atualizadoEm: timestamp("atualizado_em").defaultNow().onUpdateNow().notNull(),
});

// ─────────────────────────────────────────────────────────────
// biblioteca_menu_itens — menu de navegação do topo, editável pelo
// editor sem precisar de deploy novo.
// ─────────────────────────────────────────────────────────────
export const bibliotecaMenuItens = mysqlTable("biblioteca_menu_itens", {
  id: int("id").autoincrement().primaryKey(),
  rotulo: varchar("rotulo", { length: 100 }).notNull(),
  url: varchar("url", { length: 255 }).notNull(),
  ordem: int("ordem").notNull().default(0),
});

// ─────────────────────────────────────────────────────────────
// biblioteca_autores — colaboradores reais (autor, ilustrador,
// tradutor...), não mais texto livre. O campo `autor` (texto) em
// biblioteca_livros continua existindo como legado/exibição rápida
// pros livros antigos; publicações novas usam esta relação.
// ─────────────────────────────────────────────────────────────
export const bibliotecaAutores = mysqlTable("biblioteca_autores", {
  id: int("id").autoincrement().primaryKey(),
  nome: varchar("nome", { length: 191 }).notNull(),
  bio: text("bio"),
  fotoUrl: varchar("foto_url", { length: 500 }),
  criadoEm: timestamp("criado_em").defaultNow().notNull(),
});

export const bibliotecaLivroAutores = mysqlTable("biblioteca_livro_autores", {
  id: int("id").autoincrement().primaryKey(),
  livroId: int("livro_id").notNull(),
  autorId: int("autor_id").notNull(),
  papel: mysqlEnum("papel", ["autor", "ilustrador", "tradutor", "roteirista"]).notNull().default("autor"),
});

// ─────────────────────────────────────────────────────────────
// biblioteca_temas — Camada 3 (muitos-pra-muitos: um livro pode ter
// vários temas, ex: "Profetas" + "Escatologia").
// ─────────────────────────────────────────────────────────────
export const bibliotecaTemas = mysqlTable("biblioteca_temas", {
  id: int("id").autoincrement().primaryKey(),
  nome: varchar("nome", { length: 100 }).notNull().unique(),
});

export const bibliotecaLivroTemas = mysqlTable("biblioteca_livro_temas", {
  id: int("id").autoincrement().primaryKey(),
  livroId: int("livro_id").notNull(),
  temaId: int("tema_id").notNull(),
});

// ─────────────────────────────────────────────────────────────
// biblioteca_colecoes — Camada 4 (ex: "Heróis da Fé"). Prateleira
// temática curada; livros apontam pra cá via colecaoId.
// ─────────────────────────────────────────────────────────────
export const bibliotecaColecoes = mysqlTable("biblioteca_colecoes", {
  id: int("id").autoincrement().primaryKey(),
  nome: varchar("nome", { length: 191 }).notNull(),
  descricao: text("descricao"),
  capaUrl: varchar("capa_url", { length: 500 }),
  criadoEm: timestamp("criado_em").defaultNow().notNull(),
});

// ─────────────────────────────────────────────────────────────
// biblioteca_paginas — pipeline de imagem pra mangá/HQ/ilustrado.
// Cada linha é uma página, em ordem. O leitor escolhe este motor
// (visualizador de imagem) em vez do epub.js quando formato exige.
// ─────────────────────────────────────────────────────────────
export const bibliotecaPaginas = mysqlTable("biblioteca_paginas", {
  id: int("id").autoincrement().primaryKey(),
  livroId: int("livro_id").notNull(),
  ordem: int("ordem").notNull(),
  imagemUrl: varchar("imagem_url", { length: 500 }).notNull(),
});

// ═════════════════════════════════════════════════════════════
// CMS DA HOME — jul/2026. Decisão do Marsan: cada seção da Home
// vira lista editável pelo admin (sem motor de blocos genérico —
// ver conversa arquitetural). Uma linha singleton (id sempre 1)
// guarda o que não é repetível (Hero/Footer/SEO/Aparência); as
// demais tabelas são repeaters por seção.
// ═════════════════════════════════════════════════════════════

export const bibliotecaHomeConfig = mysqlTable("biblioteca_home_config", {
  id: int("id").autoincrement().primaryKey(),

  // Hero
  heroTitulo: varchar("hero_titulo", { length: 255 }).notNull().default("Descubra uma nova maneira de"),
  heroTituloDestaque: varchar("hero_titulo_destaque", { length: 255 }).notNull().default("conhecer a Palavra de Deus"),
  heroSubtitulo: text("hero_subtitulo"),
  heroFundoUrl: varchar("hero_fundo_url", { length: 500 }),
  heroOverlayIntensidade: int("hero_overlay_intensidade").notNull().default(80), // 0-100
  heroBuscaAtiva: boolean("hero_busca_ativa").notNull().default(true),
  heroBuscaPlaceholder: varchar("hero_busca_placeholder", { length: 150 }).notNull().default("qual leitura você procura?"),

  // Destaques / Todos os livros — critério, não seleção manual
  destaquesCriterio: mysqlEnum("destaques_criterio", ["manual", "recentes", "aleatorio"]).notNull().default("manual"),
  todosLivrosOrdenacao: mysqlEnum("todos_livros_ordenacao", ["recentes", "aleatorio", "titulo"]).notNull().default("recentes"),

  // Footer
  footerDescricao: text("footer_descricao"),
  footerCopyright: varchar("footer_copyright", { length: 255 }),

  // SEO
  seoTitulo: varchar("seo_titulo", { length: 255 }),
  seoDescricao: text("seo_descricao"),
  seoOgImagemUrl: varchar("seo_og_imagem_url", { length: 500 }),
  seoKeywords: varchar("seo_keywords", { length: 500 }),
  seoRobots: varchar("seo_robots", { length: 100 }).notNull().default("index, follow"),
  seoCanonical: varchar("seo_canonical", { length: 255 }),

  // Aparência — conjunto curado, não cor-por-elemento (decisão
  // deliberada: cor-por-elemento vira inconsistência visual rápido)
  corPrimaria: varchar("cor_primaria", { length: 20 }).notNull().default("#d4a843"),
  corFundo: varchar("cor_fundo", { length: 20 }).notNull().default("#120b05"),

  // Liga/desliga + ordem de seção — array JSON simples
  // [{chave, ativo, ordem}], sem motor de arrastar-e-soltar.
  secoesConfig: text("secoes_config"),

  atualizadoEm: timestamp("atualizado_em").defaultNow().onUpdateNow().notNull(),
});

export const bibliotecaHeroCards = mysqlTable("biblioteca_hero_cards", {
  id: int("id").autoincrement().primaryKey(),
  imagemUrl: varchar("imagem_url", { length: 500 }),
  titulo: varchar("titulo", { length: 191 }).notNull(),
  livroId: int("livro_id"), // opcional — se setado, o card linka pro livro
  linkUrl: varchar("link_url", { length: 255 }), // usado só se livroId for nulo
  ordem: int("ordem").notNull().default(0),
  ativo: boolean("ativo").notNull().default(true),
});

export const bibliotecaComoFunciona = mysqlTable("biblioteca_como_funciona", {
  id: int("id").autoincrement().primaryKey(),
  icone: varchar("icone", { length: 50 }).notNull().default("BookOpen"),
  numero: varchar("numero", { length: 10 }).notNull().default("01"),
  titulo: varchar("titulo", { length: 100 }).notNull(),
  descricao: text("descricao"),
  ordem: int("ordem").notNull().default(0),
});

export const bibliotecaAcervoItens = mysqlTable("biblioteca_acervo_itens", {
  id: int("id").autoincrement().primaryKey(),
  icone: varchar("icone", { length: 50 }).notNull().default("BookOpen"),
  nome: varchar("nome", { length: 100 }).notNull(),
  descricao: text("descricao"),
  imagemUrl: varchar("imagem_url", { length: 500 }),
  linkUrl: varchar("link_url", { length: 255 }).notNull(), // ex: /explorar?formato=manga
  ordem: int("ordem").notNull().default(0),
  ativo: boolean("ativo").notNull().default(true),
});

export const bibliotecaPublicoItens = mysqlTable("biblioteca_publico_itens", {
  id: int("id").autoincrement().primaryKey(),
  icone: varchar("icone", { length: 50 }).notNull().default("UserRound"),
  nome: varchar("nome", { length: 100 }).notNull(),
  faixaEtaria: varchar("faixa_etaria", { length: 50 }).notNull(),
  linkUrl: varchar("link_url", { length: 255 }).notNull(), // ex: /explorar?publico=infantil
  ordem: int("ordem").notNull().default(0),
  ativo: boolean("ativo").notNull().default(true),
});

export const bibliotecaBeneficios = mysqlTable("biblioteca_beneficios", {
  id: int("id").autoincrement().primaryKey(),
  icone: varchar("icone", { length: 50 }).notNull().default("Check"),
  texto: varchar("texto", { length: 255 }).notNull(),
  ordem: int("ordem").notNull().default(0),
  ativo: boolean("ativo").notNull().default(true),
});

export const bibliotecaFaqItens = mysqlTable("biblioteca_faq_itens", {
  id: int("id").autoincrement().primaryKey(),
  pergunta: varchar("pergunta", { length: 255 }).notNull(),
  resposta: text("resposta").notNull(),
  ordem: int("ordem").notNull().default(0),
  ativo: boolean("ativo").notNull().default(true),
});

// Cross-divulgação do ecossistema ONFIDE — campanha independente do
// Hero, com período de exibição (ex: Natal, Congresso, Lançamentos).
export const bibliotecaBanners = mysqlTable("biblioteca_banners", {
  id: int("id").autoincrement().primaryKey(),
  titulo: varchar("titulo", { length: 191 }).notNull(),
  texto: text("texto"),
  imagemUrl: varchar("imagem_url", { length: 500 }),
  botaoTexto: varchar("botao_texto", { length: 100 }),
  linkUrl: varchar("link_url", { length: 255 }).notNull(),
  dataInicio: date("data_inicio", { mode: "string" }),
  dataFim: date("data_fim", { mode: "string" }),
  ativo: boolean("ativo").notNull().default(true),
  ordem: int("ordem").notNull().default(0),
});

// ─────────────────────────────────────────────────────────────
// Avaliação por estrelas (1-5). Um voto por pessoa por livro —
// votar de novo atualiza a nota anterior, não duplica.
// ─────────────────────────────────────────────────────────────
export const bibliotecaAvaliacoes = mysqlTable("biblioteca_avaliacoes", {
  id: int("id").autoincrement().primaryKey(),
  livroId: int("livro_id").notNull(),
  userId: int("user_id").notNull(),
  nota: int("nota").notNull(), // 1 a 5
  criadoEm: timestamp("criado_em").defaultNow().notNull(),
  atualizadoEm: timestamp("atualizado_em").defaultNow().onUpdateNow().notNull(),
});

// ─────────────────────────────────────────────────────────────
// Registro de acesso — dedução tipo YouTube: cada linha é uma
// "visita que contou"; uma nova visita da MESMA pessoa/IP só conta
// de novo depois de passar a janela de tempo (evita inflar só de
// atualizar a página). O contador rápido fica em
// biblioteca_livros.contagemAcessos; esta tabela é só o controle.
// ─────────────────────────────────────────────────────────────
export const bibliotecaAcessoRegistros = mysqlTable("biblioteca_acesso_registros", {
  id: int("id").autoincrement().primaryKey(),
  livroId: int("livro_id").notNull(),
  identificador: varchar("identificador", { length: 191 }).notNull(), // "user:123" ou "ip:1.2.3.4"
  criadoEm: timestamp("criado_em").defaultNow().notNull(),
});
