/**
 * ELO — Seed de dados demonstração
 * Execução: npm run db:seed
 */
import { PrismaClient, UserRole, MissionStatus, MissionType, AppCategory, AutonomyLevel, DeviceOS } from '@prisma/client';
import * as argon2 from 'argon2';
import { v4 as uuidv4 } from 'uuid';
import { format } from 'date-fns';

const prisma = new PrismaClient();

async function main() {
  console.log('🌱 Iniciando seed do ELO...\n');

  // ─── Matérias e habilidades ─────────────────────────────────────────────────
  console.log('📚 Criando matérias e habilidades...');

  const subjects = await createSubjects();
  const skills = await createSkills(subjects);

  // ─── Missões de demonstração ─────────────────────────────────────────────────
  console.log('🎯 Criando missões...');
  await createMissions(subjects, skills);

  // ─── Usuário admin ────────────────────────────────────────────────────────────
  console.log('👤 Criando usuário admin...');
  await createAdmin();

  // ─── Família demo ─────────────────────────────────────────────────────────────
  console.log('👨‍👩‍👧 Criando família demonstração...');
  await createDemoFamily();

  console.log('\n✅ Seed concluído com sucesso!\n');
  console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
  console.log('  Acesso demo:');
  console.log('  Responsável: parent@elo.local / EloDemo2024!');
  console.log('  Admin:       admin@elo.local  / EloAdmin2024!');
  console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
}

async function createSubjects() {
  const data = [
    { name: 'Matemática', nameEn: 'Mathematics', slug: 'matematica', emoji: '🔢', color: '#6366F1', sortOrder: 1 },
    { name: 'Português', nameEn: 'Portuguese', slug: 'portugues', emoji: '📝', color: '#8B5CF6', sortOrder: 2 },
    { name: 'Inglês', nameEn: 'English', slug: 'ingles', emoji: '🇬🇧', color: '#EC4899', sortOrder: 3 },
    { name: 'Ciências', nameEn: 'Sciences', slug: 'ciencias', emoji: '🔬', color: '#10B981', sortOrder: 4 },
    { name: 'História', nameEn: 'History', slug: 'historia', emoji: '🏛️', color: '#F59E0B', sortOrder: 5 },
    { name: 'Segurança Digital', nameEn: 'Digital Safety', slug: 'seguranca-digital', emoji: '🛡️', color: '#EF4444', sortOrder: 6 },
    { name: 'Educação Financeira', nameEn: 'Financial Education', slug: 'educacao-financeira', emoji: '💰', color: '#14B8A6', sortOrder: 7 },
    { name: 'Geografia', nameEn: 'Geography', slug: 'geografia', emoji: '🌍', color: '#84CC16', sortOrder: 8 },
  ];

  const results: Record<string, any> = {};
  for (const s of data) {
    results[s.slug] = await prisma.subject.upsert({
      where: { slug: s.slug },
      create: s,
      update: {},
    });
  }
  return results;
}

async function createSkills(subjects: Record<string, any>) {
  const skills: Record<string, any> = {};

  // Matemática
  const fracoes = await upsertSkill({ subjectId: subjects['matematica'].id, name: 'Frações', slug: 'fracoes' });
  skills['fracoes'] = fracoes;
  skills['fracoes-equiv'] = await upsertSkill({ subjectId: subjects['matematica'].id, name: 'Equivalência de Frações', slug: 'fracoes-equiv', parentId: fracoes.id });
  skills['fracoes-comp'] = await upsertSkill({ subjectId: subjects['matematica'].id, name: 'Comparação de Frações', slug: 'fracoes-comp', parentId: fracoes.id });

  const multiplicacao = await upsertSkill({ subjectId: subjects['matematica'].id, name: 'Multiplicação', slug: 'multiplicacao' });
  skills['multiplicacao'] = multiplicacao;
  skills['mult-tabuada'] = await upsertSkill({ subjectId: subjects['matematica'].id, name: 'Tabuada', slug: 'tabuada', parentId: multiplicacao.id });

  skills['geometria'] = await upsertSkill({ subjectId: subjects['matematica'].id, name: 'Geometria', slug: 'geometria' });

  // Segurança Digital
  skills['senhas'] = await upsertSkill({ subjectId: subjects['seguranca-digital'].id, name: 'Senhas Seguras', slug: 'senhas-seguras' });
  skills['phishing'] = await upsertSkill({ subjectId: subjects['seguranca-digital'].id, name: 'Phishing', slug: 'phishing' });
  skills['privacidade'] = await upsertSkill({ subjectId: subjects['seguranca-digital'].id, name: 'Privacidade Online', slug: 'privacidade-online' });
  skills['cyberbullying'] = await upsertSkill({ subjectId: subjects['seguranca-digital'].id, name: 'Cyberbullying', slug: 'cyberbullying' });

  // Educação Financeira
  skills['orcamento'] = await upsertSkill({ subjectId: subjects['educacao-financeira'].id, name: 'Orçamento', slug: 'orcamento' });
  skills['poupanca'] = await upsertSkill({ subjectId: subjects['educacao-financeira'].id, name: 'Poupança', slug: 'poupanca' });

  return skills;
}

async function upsertSkill(data: { subjectId: string; name: string; slug: string; parentId?: string; description?: string }) {
  const existing = await prisma.skill.findFirst({
    where: { subjectId: data.subjectId, slug: data.slug },
  });
  if (existing) return existing;
  return prisma.skill.create({ data });
}

async function createMissions(subjects: Record<string, any>, skills: Record<string, any>) {
  const missions = [
    // ── MATEMÁTICA ──────────────────────────────────────────────────────────────
    {
      subjectId: subjects['matematica'].id,
      type: MissionType.EDUCATIONAL,
      status: MissionStatus.PUBLISHED,
      title: 'Frações no Dia a Dia',
      description: 'Aprenda o que são frações usando exemplos da vida cotidiana.',
      estimatedMinutes: 10,
      rewardMinutes: 10,
      difficultyLevel: 1,
      minPassRate: 0.6,
      minAgeYears: 8,
      maxAgeYears: 14,
      lessons: [
        {
          title: 'O que são Frações?',
          content: `## Frações no Dia a Dia 🍕

Uma **fração** representa uma parte de um todo.

Imagine que você tem uma pizza dividida em **8 fatias** e comeu **3 delas**.
Você comeu **3/8** da pizza!

- O número de **baixo** (denominador) = total de partes
- O número de **cima** (numerador) = partes que você pegou

**Exemplos:**
- 1/2 de uma maçã = metade
- 3/4 de um copo = quase cheio
- 2/8 de uma pizza = 2 fatias de 8`,
          questions: [
            {
              type: 'MULTIPLE_CHOICE',
              stem: 'Uma pizza tem 8 fatias. João comeu 3 fatias. Que fração da pizza João comeu?',
              explanation: 'João comeu 3 das 8 fatias, portanto comeu 3/8 da pizza. O numerador (3) representa as fatias comidas, e o denominador (8) representa o total de fatias.',
              skillSlugs: ['fracoes'],
              options: [
                { text: '3/8', isCorrect: true },
                { text: '8/3', isCorrect: false },
                { text: '3/5', isCorrect: false },
                { text: '5/8', isCorrect: false },
              ],
            },
            {
              type: 'MULTIPLE_CHOICE',
              stem: 'Em uma fração, o número que fica embaixo da barra se chama:',
              explanation: 'O denominador é o número de baixo da fração e indica em quantas partes iguais o todo foi dividido.',
              skillSlugs: ['fracoes'],
              options: [
                { text: 'Denominador', isCorrect: true },
                { text: 'Numerador', isCorrect: false },
                { text: 'Divisor', isCorrect: false },
                { text: 'Fator', isCorrect: false },
              ],
            },
            {
              type: 'TRUE_FALSE',
              stem: '1/2 e 2/4 representam a mesma quantidade.',
              explanation: '1/2 e 2/4 são frações equivalentes! Multiplicando numerador e denominador de 1/2 por 2, obtemos 2/4. As duas frações representam a mesma quantidade.',
              skillSlugs: ['fracoes', 'fracoes-equiv'],
              options: [
                { text: 'Verdadeiro', isCorrect: true },
                { text: 'Falso', isCorrect: false },
              ],
            },
            {
              type: 'MULTIPLE_CHOICE',
              stem: 'Um bolo foi cortado em 6 partes iguais. Ana comeu 2 partes. Que fração do bolo sobrou?',
              explanation: 'Se o bolo tem 6 partes e Ana comeu 2, sobraram 6 - 2 = 4 partes. Portanto sobrou 4/6 do bolo.',
              skillSlugs: ['fracoes'],
              options: [
                { text: '4/6', isCorrect: true },
                { text: '2/6', isCorrect: false },
                { text: '2/4', isCorrect: false },
                { text: '6/4', isCorrect: false },
              ],
            },
          ],
        },
      ],
    },

    // ── SEGURANÇA DIGITAL ────────────────────────────────────────────────────────
    {
      subjectId: subjects['seguranca-digital'].id,
      type: MissionType.DIGITAL_SAFETY,
      status: MissionStatus.PUBLISHED,
      title: 'Criando Senhas Fortes',
      description: 'Aprenda a criar senhas seguras para proteger suas contas.',
      estimatedMinutes: 8,
      rewardMinutes: 8,
      difficultyLevel: 1,
      minPassRate: 0.7,
      minAgeYears: 8,
      maxAgeYears: 18,
      lessons: [
        {
          title: 'O que faz uma senha segura?',
          content: `## Senhas Fortes 🔐

Uma senha forte protege suas informações online.

### Senha FRACA ❌
- \`123456\`
- \`senha\`
- Seu nome ou data de nascimento
- Palavras simples do dicionário

### Senha FORTE ✅
- Mistura letras maiúsculas e minúsculas
- Tem números
- Tem símbolos (\`!@#$%\`)
- Tem pelo menos 8 caracteres
- Não tem informações pessoais

**Exemplo fraco:** \`sofia2010\`
**Exemplo forte:** \`S0f!a@Gat0s#7\`

### Dica extra 💡
Use uma **frase** como base:
> "Eu amo meu gato chamado Bolinha!"
> → \`EuAm0G4t0#B0linha!\``,
          questions: [
            {
              type: 'MULTIPLE_CHOICE',
              stem: 'Qual dessas senhas é a mais segura?',
              explanation: 'A senha "M1nh@S3nh@!" é a mais segura porque mistura letras maiúsculas e minúsculas, números e símbolos especiais, tornando muito difícil de adivinhar.',
              skillSlugs: ['senhas'],
              options: [
                { text: 'M1nh@S3nh@!', isCorrect: true },
                { text: 'senha123', isCorrect: false },
                { text: '12345678', isCorrect: false },
                { text: 'NomeSobrenome', isCorrect: false },
              ],
            },
            {
              type: 'MULTIPLE_CHOICE',
              stem: 'Por que você NÃO deve usar sua data de nascimento como senha?',
              explanation: 'Datas de nascimento são informações pessoais fáceis de descobrir em redes sociais ou conversas. Uma boa senha não deve conter informações pessoais.',
              skillSlugs: ['senhas'],
              options: [
                { text: 'Porque é fácil de descobrir', isCorrect: true },
                { text: 'Porque números não são permitidos em senhas', isCorrect: false },
                { text: 'Porque é muito longa', isCorrect: false },
                { text: 'Porque só vale para celular', isCorrect: false },
              ],
            },
            {
              type: 'TRUE_FALSE',
              stem: 'Posso usar a mesma senha em todos os sites para não esquecer.',
              explanation: 'Usar a mesma senha em todos os sites é perigoso! Se um site for hackeado, o criminoso terá acesso a todas as suas outras contas. Use senhas diferentes para cada site importante.',
              skillSlugs: ['senhas'],
              options: [
                { text: 'Falso — é perigoso usar a mesma senha em tudo', isCorrect: true },
                { text: 'Verdadeiro — facilita lembrar', isCorrect: false },
              ],
            },
            {
              type: 'MULTIPLE_CHOICE',
              stem: 'O que é um gerenciador de senhas?',
              explanation: 'Um gerenciador de senhas é um aplicativo que armazena suas senhas com segurança, permitindo que você use senhas diferentes e fortes para cada site sem precisar memorizar todas.',
              skillSlugs: ['senhas'],
              options: [
                { text: 'Um aplicativo que guarda suas senhas com segurança', isCorrect: true },
                { text: 'Um site que mostra suas senhas para você', isCorrect: false },
                { text: 'Um programa que cria vírus', isCorrect: false },
                { text: 'Uma senha mestre que abre tudo', isCorrect: false },
              ],
            },
          ],
        },
      ],
    },

    // ── PHISHING ──────────────────────────────────────────────────────────────────
    {
      subjectId: subjects['seguranca-digital'].id,
      type: MissionType.DIGITAL_SAFETY,
      status: MissionStatus.PUBLISHED,
      title: 'Reconhecendo Golpes Online',
      description: 'Aprenda a identificar mensagens falsas e golpes na internet.',
      estimatedMinutes: 10,
      rewardMinutes: 10,
      difficultyLevel: 2,
      minPassRate: 0.7,
      minAgeYears: 10,
      lessons: [
        {
          title: 'O que é Phishing?',
          content: `## Golpes Online — Phishing 🎣

**Phishing** é quando criminosos enviam mensagens falsas para roubar suas informações.

### Sinais de alerta 🚨

1. **Urgência falsa**: "Sua conta será bloqueada em 24h!"
2. **Prêmios falsos**: "Você ganhou R$1.000! Clique aqui"
3. **Links suspeitos**: O link parece estranho ou diferente do site real
4. **Erros de português**: Textos mal escritos
5. **Pedido de senha**: Sites legítimos nunca pedem sua senha por mensagem

### O que fazer? ✅
- **Não clique** em links suspeitos
- **Pergunte** a um adulto de confiança
- **Não forneça** dados pessoais ou senhas
- **Delete** a mensagem
- **Avise** seus pais`,
          questions: [
            {
              type: 'MULTIPLE_CHOICE',
              stem: 'Você recebeu uma mensagem: "URGENTE! Sua conta do jogo será deletada em 2h! Clique aqui e coloque sua senha!" O que você deve fazer?',
              explanation: 'Esta é uma mensagem de phishing! A urgência falsa e o pedido de senha são sinais claros de golpe. Nunca clique em links suspeitos ou forneça sua senha. Mostre a mensagem para seus pais.',
              skillSlugs: ['phishing'],
              options: [
                { text: 'Mostrar para meus pais e não clicar', isCorrect: true },
                { text: 'Clicar rápido para salvar minha conta', isCorrect: false },
                { text: 'Colocar minha senha para ver o que acontece', isCorrect: false },
                { text: 'Encaminhar para meus amigos', isCorrect: false },
              ],
            },
            {
              type: 'MULTIPLE_CHOICE',
              stem: 'Qual desses é um sinal de que uma mensagem pode ser um golpe?',
              explanation: 'Urgência exagerada é um dos principais sinais de golpe. Criminosos criam pressão para que você aja sem pensar. Sites e empresas legítimas raramente exigem ação imediata com ameaças.',
              skillSlugs: ['phishing'],
              options: [
                { text: '"Responda AGORA ou perde tudo!!!"', isCorrect: true },
                { text: 'A mensagem veio do e-mail oficial da empresa', isCorrect: false },
                { text: 'A mensagem tem o logo correto da empresa', isCorrect: false },
                { text: 'A mensagem está bem escrita', isCorrect: false },
              ],
            },
            {
              type: 'TRUE_FALSE',
              stem: 'Se uma mensagem parece vir de um amigo pedindo dinheiro ou dados, é sempre seguro responder.',
              explanation: 'Não! Criminosos podem hackear contas de amigos e enviar mensagens se passando por eles. Se um "amigo" pedir algo incomum, ligue para ele para confirmar antes de fazer qualquer coisa.',
              skillSlugs: ['phishing'],
              options: [
                { text: 'Falso — a conta do amigo pode ter sido hackeada', isCorrect: true },
                { text: 'Verdadeiro — amigos são confiáveis', isCorrect: false },
              ],
            },
          ],
        },
      ],
    },

    // ── EDUCAÇÃO FINANCEIRA ────────────────────────────────────────────────────
    {
      subjectId: subjects['educacao-financeira'].id,
      type: MissionType.EDUCATIONAL,
      status: MissionStatus.PUBLISHED,
      title: 'Guardando Dinheiro',
      description: 'Descubra por que economizar é importante e como fazer isso.',
      estimatedMinutes: 8,
      rewardMinutes: 8,
      difficultyLevel: 1,
      minPassRate: 0.6,
      minAgeYears: 8,
      lessons: [
        {
          title: 'Por que guardar dinheiro?',
          content: `## Poupança — Por que guardar dinheiro? 💰

Guardar dinheiro é uma habilidade importante para a vida toda!

### Por que economizar? 🎯
- Para realizar **sonhos** (uma bicicleta, um jogo novo...)
- Para momentos de **emergência**
- Para ter **liberdade** de escolha no futuro

### A regra do cofrinho 🐷
Uma boa dica é dividir seu dinheiro assim:

| Parte | Para quê? |
|-------|-----------|
| 70%   | Gastos do dia a dia |
| 20%   | Guardar (poupança) |
| 10%   | Compartilhar / dar |

### Exemplo 💡
Se você recebe R$ 10 de mesada:
- R$ 7 pode gastar
- R$ 2 guarda
- R$ 1 pode usar para ajudar alguém`,
          questions: [
            {
              type: 'MULTIPLE_CHOICE',
              stem: 'Pedro tem R$20 de mesada. Seguindo a regra 70/20/10, quanto ele deve guardar?',
              explanation: '20% de R$20 = R$4. Pedro deve guardar R$4, gastar R$14 e usar R$2 para compartilhar.',
              skillSlugs: ['poupanca'],
              options: [
                { text: 'R$ 4,00', isCorrect: true },
                { text: 'R$ 2,00', isCorrect: false },
                { text: 'R$ 10,00', isCorrect: false },
                { text: 'R$ 14,00', isCorrect: false },
              ],
            },
            {
              type: 'MULTIPLE_CHOICE',
              stem: 'Qual é a principal diferença entre "querer" e "precisar" algo?',
              explanation: 'Precisar = necessidade básica (comida, roupa, saúde). Querer = desejo, algo que seria bom ter mas não é essencial. Saber a diferença ajuda a tomar melhores decisões com dinheiro.',
              skillSlugs: ['orcamento'],
              options: [
                { text: '"Precisar" é necessidade básica; "querer" é desejo', isCorrect: true },
                { text: 'São a mesma coisa', isCorrect: false },
                { text: '"Querer" é mais importante que "precisar"', isCorrect: false },
                { text: '"Precisar" é só para adultos', isCorrect: false },
              ],
            },
            {
              type: 'TRUE_FALSE',
              stem: 'Guardar um pouco de dinheiro todo mês é melhor do que tentar guardar tudo de uma vez.',
              explanation: 'Verdadeiro! Economizar regularmente, mesmo que pouco, cria o hábito e acumula mais ao longo do tempo. É a base do que os adultos chamam de "investimento".',
              skillSlugs: ['poupanca'],
              options: [
                { text: 'Verdadeiro', isCorrect: true },
                { text: 'Falso', isCorrect: false },
              ],
            },
          ],
        },
      ],
    },

    // ── INGLÊS ────────────────────────────────────────────────────────────────────
    {
      subjectId: subjects['ingles'].id,
      type: MissionType.EDUCATIONAL,
      status: MissionStatus.PUBLISHED,
      title: 'Cores em Inglês',
      description: 'Aprenda o nome das cores em inglês de forma divertida.',
      estimatedMinutes: 6,
      rewardMinutes: 6,
      difficultyLevel: 1,
      minPassRate: 0.7,
      minAgeYears: 7,
      maxAgeYears: 12,
      lessons: [
        {
          title: 'Colors / Cores',
          content: `## Colors 🎨

Aprenda as cores em inglês!

| Português | English |
|-----------|---------|
| Vermelho  | Red 🔴  |
| Azul      | Blue 🔵 |
| Verde     | Green 🟢|
| Amarelo   | Yellow 🟡|
| Laranja   | Orange 🟠|
| Roxo      | Purple 🟣|
| Branco    | White ⬜|
| Preto     | Black ⬛|
| Rosa      | Pink 🩷 |
| Marrom    | Brown 🟤|

### Como usar?
- The sky is **blue**. (O céu é azul.)
- Grass is **green**. (A grama é verde.)
- The sun is **yellow**. (O sol é amarelo.)`,
          questions: [
            {
              type: 'MULTIPLE_CHOICE',
              stem: 'How do you say "vermelho" in English?',
              explanation: '"Vermelho" em inglês é "red". Exemplo: "The apple is red" (A maçã é vermelha).',
              options: [
                { text: 'Red', isCorrect: true },
                { text: 'Blue', isCorrect: false },
                { text: 'Green', isCorrect: false },
                { text: 'Yellow', isCorrect: false },
              ],
            },
            {
              type: 'MULTIPLE_CHOICE',
              stem: 'What color is the sky on a sunny day?',
              explanation: 'On a sunny day, the sky is blue! "Blue" é azul em inglês.',
              options: [
                { text: 'Blue', isCorrect: true },
                { text: 'Green', isCorrect: false },
                { text: 'Red', isCorrect: false },
                { text: 'Purple', isCorrect: false },
              ],
            },
            {
              type: 'MULTIPLE_CHOICE',
              stem: '"The banana is ___." Complete com a cor correta em inglês.',
              explanation: 'Banana é amarela! Em inglês, amarelo é "yellow". A frase completa é "The banana is yellow."',
              options: [
                { text: 'Yellow', isCorrect: true },
                { text: 'Orange', isCorrect: false },
                { text: 'Pink', isCorrect: false },
                { text: 'Brown', isCorrect: false },
              ],
            },
          ],
        },
      ],
    },
  ];

  for (const missionData of missions) {
    const { lessons, ...missionFields } = missionData;
    const existing = await prisma.mission.findFirst({ where: { title: missionFields.title } });
    if (existing) continue;

    await prisma.mission.create({
      data: {
        ...missionFields,
        lessons: {
          create: lessons.map((lesson, li) => {
            const { questions, ...lessonFields } = lesson;
            return {
              ...lessonFields,
              sortOrder: li,
              questions: {
                create: (questions as any[]).map((q, qi) => {
                  const { options, skillSlugs, ...qFields } = q;
                  return {
                    ...qFields,
                    sortOrder: qi,
                    options: {
                      create: (options as any[]).map((opt: any, oi: number) => ({
                        ...opt, sortOrder: oi,
                      })),
                    },
                  };
                }),
              },
            };
          }),
        },
      },
    });
  }
}

async function createAdmin() {
  const existing = await prisma.user.findUnique({ where: { email: 'admin@elo.local' } });
  if (existing) return;

  const passwordHash = await argon2.hash('EloAdmin2024!', { type: argon2.argon2id });
  await prisma.user.create({
    data: {
      email: 'admin@elo.local',
      name: 'Admin ELO',
      passwordHash,
      role: UserRole.ADMIN,
    },
  });
}

async function createDemoFamily() {
  const existing = await prisma.user.findUnique({ where: { email: 'parent@elo.local' } });
  if (existing) return;

  const passwordHash = await argon2.hash('EloDemo2024!', { type: argon2.argon2id });

  await prisma.$transaction(async (tx) => {
    // Criar responsável
    const parentUser = await tx.user.create({
      data: {
        email: 'parent@elo.local',
        name: 'Ana Silva',
        passwordHash,
        role: UserRole.GUARDIAN,
        timezone: 'America/Sao_Paulo',
      },
    });

    // Criar família
    const family = await tx.family.create({
      data: { name: 'Família Silva', timezone: 'America/Sao_Paulo' },
    });

    // Vincular responsável
    const parentMember = await tx.familyMember.create({
      data: { familyId: family.id, userId: parentUser.id, isOwner: true },
    });
    const guardian = await tx.guardian.create({
      data: { familyMemberId: parentMember.id },
    });

    // Criar filho
    const childUser = await tx.user.create({
      data: {
        name: 'Sofia Silva',
        role: UserRole.CHILD,
        timezone: 'America/Sao_Paulo',
      },
    });

    const childMember = await tx.familyMember.create({
      data: { familyId: family.id, userId: childUser.id },
    });

    const child = await tx.child.create({
      data: {
        familyMemberId: childMember.id,
        birthDate: new Date('2015-03-15'),
        grade: '5º ano',
        avatarEmoji: '🧒',
        autonomyLevel: AutonomyLevel.PROTECTED,
      },
    });

    await tx.childGuardian.create({
      data: { childId: child.id, guardianId: guardian.id },
    });

    // Política padrão com algumas regras
    const policy = await tx.policy.create({
      data: {
        childId: child.id,
        version: 3,
        appLimits: {
          create: [
            { packageName: 'com.google.android.youtube', appName: 'YouTube', category: AppCategory.ENTERTAINMENT, dailyLimitMinutes: 30 },
            { packageName: 'com.roblox.client', appName: 'Roblox', category: AppCategory.GAMES, dailyLimitMinutes: 45 },
            { packageName: 'com.instagram.android', appName: 'Instagram', category: AppCategory.SOCIAL, isBlocked: true },
            { packageName: 'com.whatsapp', appName: 'WhatsApp', category: AppCategory.COMMUNICATION, isEssential: true },
            { packageName: 'com.google.android.dialer', appName: 'Telefone', category: AppCategory.ESSENTIAL, isEssential: true },
          ],
        },
        catLimits: {
          create: [
            { category: AppCategory.ENTERTAINMENT, dailyLimitMinutes: 60 },
            { category: AppCategory.GAMES, dailyLimitMinutes: 45 },
            { category: AppCategory.SOCIAL, isBlocked: true },
          ],
        },
        schedules: {
          create: [
            {
              name: 'Escola',
              startTime: '07:00',
              endTime: '12:00',
              daysOfWeek: [1, 2, 3, 4, 5],
              blockedCategories: [AppCategory.GAMES, AppCategory.SOCIAL, AppCategory.ENTERTAINMENT],
            },
            {
              name: 'Sono',
              startTime: '21:30',
              endTime: '07:00',
              daysOfWeek: [0, 1, 2, 3, 4, 5, 6],
              blockedCategories: [AppCategory.GAMES, AppCategory.SOCIAL, AppCategory.ENTERTAINMENT, AppCategory.OTHER],
            },
          ],
        },
      },
    });

    // Dispositivo demo
    const device = await tx.device.create({
      data: {
        childId: child.id,
        name: 'Tablet da Sofia',
        os: DeviceOS.ANDROID,
        osVersion: '13',
        appVersion: '1.0.0',
        deviceToken: uuidv4(),
        isActive: true,
        lastSeenAt: new Date(),
        lastSyncAt: new Date(),
        policyVersion: 3,
      },
    });

    // Carteira de tempo
    const today = format(new Date(), 'yyyy-MM-dd');
    const wallet = await tx.timeWallet.create({
      data: {
        childId: child.id,
        balanceMinutes: 35,
        dailyFreeMinutes: 60,
        dailyConditionalMinutes: 60,
        dailyMaxMinutes: 120,
        usedMinutesToday: 45,
        earnedConditionalToday: 20,
        lastResetDate: today,
      },
    });

    // Transações históricas demo
    await tx.timeTransaction.createMany({
      data: [
        {
          walletId: wallet.id,
          type: 'FREE_DAILY',
          minutes: 60,
          balanceBefore: 0,
          balanceAfter: 60,
          description: 'Tempo livre diário',
          idempotencyKey: `demo-free-${today}`,
        },
        {
          walletId: wallet.id,
          type: 'APP_USAGE',
          minutes: -45,
          balanceBefore: 60,
          balanceAfter: 15,
          description: 'Uso de apps de entretenimento',
          idempotencyKey: `demo-usage-${today}`,
        },
        {
          walletId: wallet.id,
          type: 'MISSION_REWARD',
          minutes: 20,
          balanceBefore: 15,
          balanceAfter: 35,
          description: 'Missão concluída: Frações no Dia a Dia',
          idempotencyKey: `demo-mission-reward-${today}`,
        },
      ],
    });

    // Atribuir missões à Sofia
    const missions = await tx.mission.findMany({
      where: { status: MissionStatus.PUBLISHED },
      take: 4,
    });

    if (missions.length > 0) {
      const exp = new Date();
      exp.setDate(exp.getDate() + 7);

      // Primeira missão: completada
      await tx.missionAssignment.create({
        data: {
          missionId: missions[0].id,
          childId: child.id,
          status: 'COMPLETED',
          attemptsUsed: 1,
          bestScore: 0.85,
          completedAt: new Date(Date.now() - 3600000),
          expiresAt: exp,
          rewardCredited: true,
          assignedBy: 'system',
        },
      });

      // Demais: pendentes
      for (let i = 1; i < Math.min(missions.length, 4); i++) {
        await tx.missionAssignment.create({
          data: {
            missionId: missions[i].id,
            childId: child.id,
            status: 'PENDING',
            expiresAt: exp,
            assignedBy: 'system',
          },
        });
      }
    }

    console.log(`\n  Família criada: ${family.name}`);
    console.log(`  Responsável: Ana Silva (parent@elo.local)`);
    console.log(`  Filho: Sofia Silva | Dispositivo: ${device.name}`);
    console.log(`  Carteira: 35min disponíveis | 20min ganhos por missões hoje`);
  });
}

main()
  .catch((e) => { console.error('❌ Erro no seed:', e); process.exit(1); })
  .finally(() => prisma.$disconnect());
