import { PrismaClient } from '@prisma/client'
import bcrypt from 'bcryptjs'

const prisma = new PrismaClient()

async function main() {
  console.log('🌱 Seeding database...')

  // ── Users ──
  const passwordHash = await bcrypt.hash('123456', 10)

  const admin = await prisma.user.upsert({
    where: { email: 'admin@juridico.ai' },
    update: {},
    create: {
      name: 'Admin Sistema',
      email: 'admin@juridico.ai',
      password: passwordHash,
      role: 'ADMIN',
      plan: 'ENTERPRISE',
      credits: 9999,
      phone: '11999999999',
    },
  })

  const advogadoPro = await prisma.user.upsert({
    where: { email: 'maria@advocacia.com' },
    update: {},
    create: {
      name: 'Maria Silva',
      email: 'maria@advocacia.com',
      password: passwordHash,
      role: 'ADVOGADO',
      plan: 'PRO',
      oabNumber: '123456',
      oabState: 'SP',
      credits: 100,
      phone: '11988888888',
    },
  })

  const advogadoFree = await prisma.user.upsert({
    where: { email: 'joao@email.com' },
    update: {},
    create: {
      name: 'João Santos',
      email: 'joao@email.com',
      password: passwordHash,
      role: 'ADVOGADO',
      plan: 'FREE',
      oabNumber: '654321',
      oabState: 'RJ',
      credits: 5,
      phone: '21977777777',
    },
  })

  console.log('✅ Users created:', admin.name, advogadoPro.name, advogadoFree.name)

  // ── Subscriptions ──
  await prisma.subscription.createMany({
    data: [
      { userId: admin.id, plan: 'ENTERPRISE', status: 'ACTIVE' },
      { userId: advogadoPro.id, plan: 'PRO', status: 'ACTIVE', stripeId: 'sub_mock_pro_001' },
      { userId: advogadoFree.id, plan: 'FREE', status: 'ACTIVE' },
    ],
  })

  // ── Templates ──
  const templates = await Promise.all([
    prisma.template.create({
      data: {
        name: 'Petição Inicial Cível',
        description: 'Modelo de petição inicial para ações cíveis com fundamentação completa',
        type: 'PETICAO_INICIAL',
        area: 'CIVIL',
        prompt: 'Elabore uma petição inicial cível com os seguintes dados: {{fatos}}. Inclua fundamentação jurídica com base no CPC e CC, pedidos e valor da causa.',
        isPublic: true,
        userId: admin.id,
      },
    }),
    prisma.template.create({
      data: {
        name: 'Contestação Trabalhista',
        description: 'Modelo de contestação para reclamações trabalhistas',
        type: 'CONTESTACAO',
        area: 'TRABALHISTA',
        prompt: 'Elabore uma contestação trabalhista para a reclamação: {{fatos}}. Inclua preliminares, mérito e impugnação aos pedidos com base na CLT.',
        isPublic: true,
        userId: admin.id,
      },
    }),
    prisma.template.create({
      data: {
        name: 'Recurso de Apelação',
        description: 'Modelo de recurso de apelação com razões recursais',
        type: 'APELACAO',
        area: 'CIVIL',
        prompt: 'Elabore um recurso de apelação com base na sentença: {{sentenca}}. Apresente razões recursais, error in judicando/procedendo e pedido de reforma.',
        isPublic: true,
        userId: admin.id,
      },
    }),
    prisma.template.create({
      data: {
        name: 'Contrato de Prestação de Serviços',
        description: 'Modelo de contrato de prestação de serviços advocatícios',
        type: 'CONTRATO',
        area: 'CIVIL',
        prompt: 'Elabore um contrato de prestação de serviços entre {{contratante}} e {{contratado}}. Escopo: {{escopo}}. Valor: {{valor}}. Inclua cláusulas de confidencialidade, rescisão e foro.',
        isPublic: true,
        userId: admin.id,
      },
    }),
    prisma.template.create({
      data: {
        name: 'Habeas Corpus',
        description: 'Modelo de habeas corpus preventivo ou liberatório',
        type: 'HABEAS_CORPUS',
        area: 'PENAL',
        prompt: 'Elabore um habeas corpus {{tipo}} em favor de {{paciente}}, contra ato de {{autoridade_coatora}}. Fatos: {{fatos}}. Fundamente no art. 5º, LXVIII da CF e arts. 647-667 do CPP.',
        isPublic: true,
        userId: admin.id,
      },
    }),
  ])

  console.log('✅ Templates created:', templates.length)

  // ── Jurisprudências ──
  const jurisprudencias = await Promise.all([
    prisma.jurisprudencia.create({
      data: {
        tribunal: 'STF',
        numero: 'RE 1.322.076/SP',
        ementa: 'RECURSO EXTRAORDINÁRIO. DIREITO DO CONSUMIDOR. RESPONSABILIDADE CIVIL. DANO MORAL. INSCRIÇÃO INDEVIDA EM CADASTRO DE INADIMPLENTES. A inscrição indevida do nome do consumidor em cadastros de proteção ao crédito configura dano moral in re ipsa, dispensando a comprovação do prejuízo efetivo. Recurso extraordinário não provido.',
        data: '2024-03-15',
        area: 'CONSUMIDOR',
        relator: 'Min. Luís Roberto Barroso',
        orgaoJulgador: 'Primeira Turma',
        tags: JSON.stringify(['dano moral', 'consumidor', 'cadastro inadimplentes', 'SPC', 'Serasa']),
      },
    }),
    prisma.jurisprudencia.create({
      data: {
        tribunal: 'STJ',
        numero: 'REsp 2.045.123/RJ',
        ementa: 'RECURSO ESPECIAL. DIREITO CIVIL. RESPONSABILIDADE CIVIL. ACIDENTE DE TRÂNSITO. DANOS MATERIAIS E MORAIS. QUANTUM INDENIZATÓRIO. Revisão do valor da indenização por danos morais quando se mostrar irrisório ou excessivo. Manutenção do quantum fixado pelo Tribunal de origem dentro dos parâmetros de razoabilidade.',
        data: '2024-05-20',
        area: 'CIVIL',
        relator: 'Min. Nancy Andrighi',
        orgaoJulgador: 'Terceira Turma',
        tags: JSON.stringify(['acidente trânsito', 'dano moral', 'dano material', 'quantum indenizatório']),
      },
    }),
    prisma.jurisprudencia.create({
      data: {
        tribunal: 'STF',
        numero: 'ADI 6.341/DF',
        ementa: 'AÇÃO DIRETA DE INCONSTITUCIONALIDADE. DIREITO ADMINISTRATIVO. COMPETÊNCIA CONCORRENTE. ESTADOS E MUNICÍPIOS. MEDIDAS SANITÁRIAS. Reconhecimento da competência concorrente de estados e municípios para adoção de medidas restritivas durante emergência sanitária. Interpretação conforme à Constituição.',
        data: '2024-01-10',
        area: 'ADMINISTRATIVO',
        relator: 'Min. Marco Aurélio',
        orgaoJulgador: 'Tribunal Pleno',
        tags: JSON.stringify(['competência concorrente', 'saúde pública', 'federalismo', 'autonomia']),
      },
    }),
    prisma.jurisprudencia.create({
      data: {
        tribunal: 'STJ',
        numero: 'RHC 163.334/SC',
        ementa: 'RECURSO EM HABEAS CORPUS. DIREITO PENAL. FURTO. PRINCÍPIO DA INSIGNIFICÂNCIA. CRIME DE BAGATELA. Aplicação do princípio da insignificância ao furto de bem avaliado em valor inferior a 10% do salário mínimo. Atipicidade material da conduta. Recurso provido.',
        data: '2024-04-18',
        area: 'PENAL',
        relator: 'Min. Sebastião Reis Júnior',
        orgaoJulgador: 'Sexta Turma',
        tags: JSON.stringify(['furto', 'insignificância', 'bagatela', 'atipicidade']),
      },
    }),
    prisma.jurisprudencia.create({
      data: {
        tribunal: 'STF',
        numero: 'ARE 1.121.633/GO',
        ementa: 'AGRAVO EM RECURSO EXTRAORDINÁRIO. DIREITO DO TRABALHO. TERCEIRIZAÇÃO. ATIVIDADE-FIM. LICITUDE. É lícita a terceirização ou qualquer outra forma de divisão do trabalho entre pessoas jurídicas distintas, independentemente do objeto social das empresas envolvidas, mantida a responsabilidade subsidiária da empresa contratante. Tema 725 de repercussão geral.',
        data: '2024-02-28',
        area: 'TRABALHISTA',
        relator: 'Min. Gilmar Mendes',
        orgaoJulgador: 'Tribunal Pleno',
        tags: JSON.stringify(['terceirização', 'atividade-fim', 'responsabilidade subsidiária', 'tema 725']),
      },
    }),
    prisma.jurisprudencia.create({
      data: {
        tribunal: 'STJ',
        numero: 'REsp 1.869.043/SP',
        ementa: 'RECURSO ESPECIAL. DIREITO TRIBUTÁRIO. ICMS. BASE DE CÁLCULO. EXCLUSÃO DO PIS E COFINS. Em consonância com o entendimento firmado pelo STF no Tema 69, o ICMS a ser excluído da base de cálculo do PIS e da COFINS é o destacado na nota fiscal. Recurso especial não provido.',
        data: '2024-06-05',
        area: 'TRIBUTARIO',
        relator: 'Min. Herman Benjamin',
        orgaoJulgador: 'Segunda Turma',
        tags: JSON.stringify(['ICMS', 'PIS', 'COFINS', 'base de cálculo', 'tema 69']),
      },
    }),
    prisma.jurisprudencia.create({
      data: {
        tribunal: 'STF',
        numero: 'RE 898.060/SC',
        ementa: 'RECURSO EXTRAORDINÁRIO. DIREITO DE FAMÍLIA. PATERNIDADE SOCIOAFETIVA. MULTIPARENTALIDADE. A paternidade socioafetiva, declarada ou não em registro público, não impede o reconhecimento do vínculo de filiação concomitante baseado na origem biológica, com os efeitos jurídicos próprios. Tema 622.',
        data: '2024-03-22',
        area: 'FAMILIA',
        relator: 'Min. Luiz Fux',
        orgaoJulgador: 'Tribunal Pleno',
        tags: JSON.stringify(['paternidade socioafetiva', 'multiparentalidade', 'filiação', 'tema 622']),
      },
    }),
    prisma.jurisprudencia.create({
      data: {
        tribunal: 'STJ',
        numero: 'REsp 1.951.532/RS',
        ementa: 'RECURSO ESPECIAL. DIREITO EMPRESARIAL. RECUPERAÇÃO JUDICIAL. PLANO DE RECUPERAÇÃO. CRAM DOWN. Possibilidade de aprovação do plano de recuperação judicial pelo juiz mesmo sem a concordância de todas as classes de credores, desde que preenchidos os requisitos do art. 58, §1º da Lei 11.101/2005.',
        data: '2024-07-12',
        area: 'EMPRESARIAL',
        relator: 'Min. Ricardo Villas Bôas Cueva',
        orgaoJulgador: 'Terceira Turma',
        tags: JSON.stringify(['recuperação judicial', 'cram down', 'plano recuperação', 'credores']),
      },
    }),
    prisma.jurisprudencia.create({
      data: {
        tribunal: 'STF',
        numero: 'HC 124.306/RJ',
        ementa: 'HABEAS CORPUS. DIREITO PENAL. ABORTO. INTERRUPÇÃO VOLUNTÁRIA DA GESTAÇÃO. PRIMEIRO TRIMESTRE. É preciso conferir interpretação conforme a Constituição aos arts. 124 a 126 do Código Penal para excluir do seu âmbito de incidência a interrupção voluntária da gestação efetivada no primeiro trimestre.',
        data: '2024-08-01',
        area: 'PENAL',
        relator: 'Min. Luís Roberto Barroso',
        orgaoJulgador: 'Primeira Turma',
        tags: JSON.stringify(['aborto', 'primeiro trimestre', 'interpretação conforme', 'direitos fundamentais']),
      },
    }),
    prisma.jurisprudencia.create({
      data: {
        tribunal: 'STJ',
        numero: 'REsp 1.733.013/PR',
        ementa: 'RECURSO ESPECIAL. DIREITO DO CONSUMIDOR. COMÉRCIO ELETRÔNICO. RESPONSABILIDADE DO MARKETPLACE. A plataforma digital que intermedia a venda de produtos responde solidariamente pelos vícios e defeitos dos produtos comercializados por terceiros em seu ambiente virtual, nos termos do CDC.',
        data: '2024-09-10',
        area: 'CONSUMIDOR',
        relator: 'Min. Paulo de Tarso Sanseverino',
        orgaoJulgador: 'Terceira Turma',
        tags: JSON.stringify(['marketplace', 'comércio eletrônico', 'responsabilidade solidária', 'CDC', 'plataforma digital']),
      },
    }),
  ])

  console.log('✅ Jurisprudências created:', jurisprudencias.length)

  // ── Sample Documents ──
  const documents = await Promise.all([
    prisma.document.create({
      data: {
        userId: advogadoPro.id,
        type: 'PETICAO_INICIAL',
        title: 'Petição Inicial - Ação de Indenização por Danos Morais',
        prompt: 'Elaborar petição inicial para ação de indenização por danos morais decorrente de inscrição indevida no SPC',
        content: 'EXCELENTÍSSIMO SENHOR DOUTOR JUIZ DE DIREITO DA ___ VARA CÍVEL DA COMARCA DE SÃO PAULO/SP\n\nMARIA DA SILVA, brasileira, solteira, professora, portadora do RG nº 12.345.678-9 e CPF nº 123.456.789-00, residente e domiciliada na Rua das Flores, nº 100, Jardim Primavera, São Paulo/SP, CEP 01234-567, vem, respeitosamente, à presença de Vossa Excelência, por intermédio de seus procuradores que esta subscrevem, propor a presente AÇÃO DE INDENIZAÇÃO POR DANOS MORAIS em face de BANCO XYZ S/A...\n\n[Documento completo gerado pela IA]',
        wordCount: 2500,
        status: 'COMPLETED',
        area: 'CONSUMIDOR',
        tokens: 3200,
        cost: 0.032,
      },
    }),
    prisma.document.create({
      data: {
        userId: advogadoPro.id,
        type: 'CONTESTACAO',
        title: 'Contestação - Reclamação Trabalhista',
        prompt: 'Elaborar contestação para reclamação trabalhista sobre horas extras e adicional noturno',
        content: 'EXCELENTÍSSIMO SENHOR DOUTOR JUIZ DO TRABALHO DA ___ VARA DO TRABALHO DE SÃO PAULO/SP\n\nProcesso nº 0001234-56.2024.5.02.0001\n\nEMPRESA ABC LTDA, pessoa jurídica de direito privado, inscrita no CNPJ sob nº 12.345.678/0001-90, com sede na Avenida Paulista, nº 1000, São Paulo/SP, vem, respeitosamente, apresentar CONTESTAÇÃO à reclamação trabalhista movida por JOÃO CARLOS SOUZA...\n\n[Documento completo gerado pela IA]',
        wordCount: 3100,
        status: 'COMPLETED',
        area: 'TRABALHISTA',
        tokens: 4100,
        cost: 0.041,
      },
    }),
    prisma.document.create({
      data: {
        userId: advogadoFree.id,
        type: 'CONTRATO',
        title: 'Contrato de Honorários Advocatícios',
        prompt: 'Elaborar contrato de honorários para consultoria jurídica empresarial mensal',
        content: 'CONTRATO DE PRESTAÇÃO DE SERVIÇOS ADVOCATÍCIOS\n\nPelo presente instrumento particular, de um lado EMPRESA DELTA COMÉRCIO LTDA como CONTRATANTE e de outro a DRA. JOÃO SANTOS - OAB/RJ 654321 como CONTRATADO...\n\n[Documento completo gerado pela IA]',
        wordCount: 1800,
        status: 'COMPLETED',
        area: 'EMPRESARIAL',
        tokens: 2200,
        cost: 0.022,
      },
    }),
  ])

  console.log('✅ Documents created:', documents.length)

  // ── Sample Chat ──
  const chat = await prisma.chat.create({
    data: {
      userId: advogadoPro.id,
      title: 'Dúvida sobre prescrição em ação de cobrança',
      messages: {
        create: [
          {
            role: 'USER',
            content: 'Qual o prazo prescricional para ação de cobrança de dívida por contrato verbal?',
            tokens: 25,
          },
          {
            role: 'ASSISTANT',
            content: 'O prazo prescricional para ação de cobrança de dívida originada de contrato verbal é de **10 anos**, conforme o art. 205 do Código Civil de 2002, que estabelece o prazo prescricional genérico. Contudo, se houver documento escrito (como um título de crédito), o prazo pode ser diferente:\n\n- **Cheque:** 6 meses (art. 59, Lei 7.357/85)\n- **Nota promissória:** 3 anos (art. 70, LUG)\n- **Duplicata:** 3 anos (art. 18, Lei 5.474/68)\n\nImportante: O prazo começa a contar da data do vencimento da dívida (art. 199, CC).',
            tokens: 180,
          },
        ],
      },
    },
  })

  console.log('✅ Chat created:', chat.title)

  // ── Usage Logs ──
  await prisma.usageLog.createMany({
    data: [
      { userId: advogadoPro.id, type: 'DOCUMENT', tokens: 3200, cost: 0.032 },
      { userId: advogadoPro.id, type: 'DOCUMENT', tokens: 4100, cost: 0.041 },
      { userId: advogadoPro.id, type: 'CHAT', tokens: 205, cost: 0.002 },
      { userId: advogadoFree.id, type: 'DOCUMENT', tokens: 2200, cost: 0.022 },
      { userId: advogadoPro.id, type: 'JURISPRUDENCIA', tokens: 150, cost: 0.001 },
    ],
  })

  console.log('✅ Usage logs created')

  // ── API Keys ──
  await prisma.apiKey.create({
    data: {
      key: 'jur_live_sk_' + 'a'.repeat(32),
      name: 'API Principal',
      userId: advogadoPro.id,
      active: true,
    },
  })

  console.log('✅ API keys created')
  console.log('\n🎉 Seed completed successfully!')
  console.log('\n📋 Login credentials (all passwords: 123456):')
  console.log('  Admin:    admin@juridico.ai')
  console.log('  Pro:      maria@advocacia.com')
  console.log('  Free:     joao@email.com')
}

main()
  .then(async () => {
    await prisma.$disconnect()
  })
  .catch(async (e) => {
    console.error(e)
    await prisma.$disconnect()
    process.exit(1)
  })
