// Service para Monitoramento de Publicações

// Regex para validar número de processo no padrão CNJ
// Formato: NNNNNNN-DD.AAAA.J.TR.OOOO
const CNJ_REGEX = /^\d{7}-\d{2}\.\d{4}\.\d{1}\.\d{2}\.\d{4}$/

export function validarNumeroCNJ(numero: string): boolean {
  return CNJ_REGEX.test(numero)
}

export function formatarNumeroCNJ(numero: string): string {
  // Remove tudo que não é número
  const digits = numero.replace(/\D/g, '')
  
  if (digits.length !== 20) return numero
  
  // Formata: NNNNNNN-DD.AAAA.J.TR.OOOO
  return `${digits.slice(0, 7)}-${digits.slice(7, 9)}.${digits.slice(9, 13)}.${digits.slice(13, 14)}.${digits.slice(14, 16)}.${digits.slice(16, 20)}`
}

// Prazos típicos por tipo de publicação (em dias úteis)
const PRAZOS_PADRAO: Record<string, { dias: number; tipo: string }> = {
  INTIMACAO: { dias: 15, tipo: '15 dias úteis' },
  CITACAO: { dias: 15, tipo: '15 dias úteis' },
  SENTENCA: { dias: 15, tipo: '15 dias úteis para recurso' },
  DESPACHO: { dias: 5, tipo: '5 dias úteis' },
  ACORDAO: { dias: 15, tipo: '15 dias úteis para embargos/recurso' },
  OUTROS: { dias: 5, tipo: '5 dias úteis' },
}

// Calcula prazo adicionando dias úteis
export function calcularPrazo(dataPublicacao: Date, tipoPublicacao: string): { prazoCalculado: Date; prazoTipo: string } {
  const config = PRAZOS_PADRAO[tipoPublicacao] || PRAZOS_PADRAO.OUTROS
  
  let diasRestantes = config.dias
  const resultado = new Date(dataPublicacao)
  
  while (diasRestantes > 0) {
    resultado.setDate(resultado.getDate() + 1)
    const diaSemana = resultado.getDay()
    // Pula fim de semana (0 = domingo, 6 = sábado)
    if (diaSemana !== 0 && diaSemana !== 6) {
      diasRestantes--
    }
  }
  
  return {
    prazoCalculado: resultado,
    prazoTipo: config.tipo,
  }
}

// Lista de tribunais disponíveis
export const TRIBUNAIS = [
  { value: 'STF', label: 'Supremo Tribunal Federal' },
  { value: 'STJ', label: 'Superior Tribunal de Justiça' },
  { value: 'TST', label: 'Tribunal Superior do Trabalho' },
  { value: 'TSE', label: 'Tribunal Superior Eleitoral' },
  { value: 'STM', label: 'Superior Tribunal Militar' },
  { value: 'TRF1', label: 'TRF 1ª Região (DF, GO, MT, TO, AC, AM, AP, BA, MA, MG, PA, PI, RO, RR)' },
  { value: 'TRF2', label: 'TRF 2ª Região (RJ, ES)' },
  { value: 'TRF3', label: 'TRF 3ª Região (SP, MS)' },
  { value: 'TRF4', label: 'TRF 4ª Região (RS, PR, SC)' },
  { value: 'TRF5', label: 'TRF 5ª Região (PE, AL, CE, PB, RN, SE)' },
  { value: 'TRF6', label: 'TRF 6ª Região (MG)' },
  { value: 'TJSP', label: 'Tribunal de Justiça de São Paulo' },
  { value: 'TJRJ', label: 'Tribunal de Justiça do Rio de Janeiro' },
  { value: 'TJMG', label: 'Tribunal de Justiça de Minas Gerais' },
  { value: 'TJRS', label: 'Tribunal de Justiça do Rio Grande do Sul' },
  { value: 'TJPR', label: 'Tribunal de Justiça do Paraná' },
  { value: 'TJSC', label: 'Tribunal de Justiça de Santa Catarina' },
  { value: 'TJBA', label: 'Tribunal de Justiça da Bahia' },
  { value: 'TJPE', label: 'Tribunal de Justiça de Pernambuco' },
  { value: 'TJCE', label: 'Tribunal de Justiça do Ceará' },
  { value: 'TJDF', label: 'Tribunal de Justiça do Distrito Federal' },
  { value: 'TJGO', label: 'Tribunal de Justiça de Goiás' },
  { value: 'TJMA', label: 'Tribunal de Justiça do Maranhão' },
  { value: 'TJPA', label: 'Tribunal de Justiça do Pará' },
  { value: 'TJMT', label: 'Tribunal de Justiça de Mato Grosso' },
  { value: 'TJMS', label: 'Tribunal de Justiça de Mato Grosso do Sul' },
  { value: 'TJES', label: 'Tribunal de Justiça do Espírito Santo' },
  { value: 'TJAL', label: 'Tribunal de Justiça de Alagoas' },
  { value: 'TJAM', label: 'Tribunal de Justiça do Amazonas' },
  { value: 'TJPB', label: 'Tribunal de Justiça da Paraíba' },
  { value: 'TJPI', label: 'Tribunal de Justiça do Piauí' },
  { value: 'TJRN', label: 'Tribunal de Justiça do Rio Grande do Norte' },
  { value: 'TJSE', label: 'Tribunal de Justiça de Sergipe' },
  { value: 'TJTO', label: 'Tribunal de Justiça do Tocantins' },
  { value: 'TJAC', label: 'Tribunal de Justiça do Acre' },
  { value: 'TJAP', label: 'Tribunal de Justiça do Amapá' },
  { value: 'TJRO', label: 'Tribunal de Justiça de Rondônia' },
  { value: 'TJRR', label: 'Tribunal de Justiça de Roraima' },
]

// Tipos de publicação
export const TIPOS_PUBLICACAO = [
  { value: 'INTIMACAO', label: 'Intimação', color: 'blue' },
  { value: 'CITACAO', label: 'Citação', color: 'purple' },
  { value: 'SENTENCA', label: 'Sentença', color: 'red' },
  { value: 'DESPACHO', label: 'Despacho', color: 'yellow' },
  { value: 'ACORDAO', label: 'Acórdão', color: 'orange' },
  { value: 'OUTROS', label: 'Outros', color: 'zinc' },
]

// Mock de publicações para teste (MVP)
export function gerarPublicacoesMock(processoId: string, numeroProcesso: string, tribunal: string): Array<{
  dataPublicacao: Date
  diario: string
  conteudo: string
  tipo: string
  prazoCalculado: Date
  prazoTipo: string
}> {
  const tipos = ['INTIMACAO', 'DESPACHO', 'CITACAO', 'SENTENCA']
  const diarios = ['DJe', 'DOESP', 'DOU']
  
  // Gera 1-3 publicações mock
  const count = Math.floor(Math.random() * 3) + 1
  const results = []
  
  for (let i = 0; i < count; i++) {
    const tipo = tipos[Math.floor(Math.random() * tipos.length)]
    const dataPublicacao = new Date()
    dataPublicacao.setDate(dataPublicacao.getDate() - Math.floor(Math.random() * 10))
    
    const { prazoCalculado, prazoTipo } = calcularPrazo(dataPublicacao, tipo)
    
    results.push({
      dataPublicacao,
      diario: diarios[Math.floor(Math.random() * diarios.length)],
      conteudo: gerarConteudoMock(tipo, numeroProcesso, tribunal),
      tipo,
      prazoCalculado,
      prazoTipo,
    })
  }
  
  return results
}

function gerarConteudoMock(tipo: string, numeroProcesso: string, tribunal: string): string {
  const templates: Record<string, string[]> = {
    INTIMACAO: [
      `INTIMAÇÃO. Processo nº ${numeroProcesso}. Fica a parte autora intimada para, no prazo de 15 (quinze) dias úteis, manifestar-se sobre a contestação apresentada pela parte ré. ${tribunal}.`,
      `INTIMAÇÃO. Processo nº ${numeroProcesso}. Intima-se o(a) advogado(a) da parte autora para retirar em cartório os autos do processo para ciência e manifestação no prazo legal. ${tribunal}.`,
    ],
    DESPACHO: [
      `DESPACHO. Processo nº ${numeroProcesso}. Vistos. Defiro a juntada dos documentos. Aguarde-se o prazo para manifestação da parte contrária. ${tribunal}.`,
      `DESPACHO. Processo nº ${numeroProcesso}. Recebo a petição de ID anterior. Dê-se vista à parte contrária para manifestação no prazo de 5 (cinco) dias úteis. ${tribunal}.`,
    ],
    CITACAO: [
      `CITAÇÃO. Processo nº ${numeroProcesso}. Fica a parte ré citada para, querendo, apresentar contestação no prazo de 15 (quinze) dias úteis, sob pena de revelia. ${tribunal}.`,
    ],
    SENTENCA: [
      `SENTENÇA. Processo nº ${numeroProcesso}. Ante o exposto, JULGO PROCEDENTE o pedido formulado na inicial para condenar a parte ré ao pagamento de... Custas e honorários pela parte vencida. P.R.I. ${tribunal}.`,
      `SENTENÇA. Processo nº ${numeroProcesso}. Por tudo quanto exposto, JULGO IMPROCEDENTE o pedido inicial. Custas e honorários pela parte autora. Sentença registrada eletronicamente. P.R.I. ${tribunal}.`,
    ],
    ACORDAO: [
      `ACÓRDÃO. Processo nº ${numeroProcesso}. Vistos, relatados e discutidos estes autos, acordam os Desembargadores da Câmara em, por unanimidade, NEGAR PROVIMENTO ao recurso de apelação. ${tribunal}.`,
    ],
    OUTROS: [
      `PUBLICAÇÃO. Processo nº ${numeroProcesso}. Certidão de publicação no Diário da Justiça Eletrônico. ${tribunal}.`,
    ],
  }
  
  const options = templates[tipo] || templates.OUTROS
  return options[Math.floor(Math.random() * options.length)]
}
