/**
 * Script: reset-demo-asignaciones
 *
 * Deja el tenant Demo Ventas listo para que el usuario haga manualmente
 * el flujo de asignación de carteras, obligaciones y tareas (útiles para tutoriales):
 *  - Elimina la subcartera del auxiliar.
 *  - Deja todos los contribuyentes en la cartera principal (sin auxiliar).
 *  - Elimina asignaciones de obligaciones y tareas.
 *  - Elimina la relación auxiliar → supervisor.
 *
 * Ejecución:
 *   cd apps/api && npx tsx scripts/reset-demo-asignaciones.ts
 */
import { PrismaClient } from '@prisma/client';
import { tenantDb } from '../src/config/database.ts';

const prisma = new PrismaClient();
const DEMO_RFC = 'DEMO2501019X2';

async function findUserIdByEmail(email: string): Promise<string | null> {
  const rows = await prisma.$queryRawUnsafe<{ id: string }[]>(
    `SELECT id FROM users WHERE email = $1 LIMIT 1`,
    email,
  );
  return rows[0]?.id ?? null;
}

async function main() {
  console.log('🔄 Reseteando asignaciones de Demo Ventas para tutoriales...\n');

  const tenants = await prisma.$queryRawUnsafe<{ id: string; database_name: string }[]>(
    `SELECT id, database_name FROM tenants WHERE rfc = $1 LIMIT 1`,
    DEMO_RFC,
  );
  const tenant = tenants[0];
  if (!tenant) throw new Error(`Tenant ${DEMO_RFC} no encontrado`);

  const supervisorId = await findUserIdByEmail('supervisor@horuxfin.com');
  if (!supervisorId) throw new Error('Usuario supervisor no encontrado');

  const auxiliarId = await findUserIdByEmail('auxiliar@horuxfin.com');

  const pool = await tenantDb.getPool(tenant.id, tenant.database_name);
  const client = await pool.connect();

  try {
    await client.query('BEGIN');

    // Eliminar asignaciones de obligaciones y tareas
    await client.query('DELETE FROM obligacion_asignaciones');
    await client.query('DELETE FROM tarea_asignaciones');
    console.log('✅ Asignaciones de obligaciones y tareas eliminadas');

    // Obtener cartera principal
    const { rows: [carteraPrincipal] } = await client.query<{ id: string }>(`
      SELECT id FROM carteras WHERE parent_id IS NULL ORDER BY created_at LIMIT 1
    `);
    if (!carteraPrincipal) throw new Error('No existe cartera principal');

    // Eliminar subcarteras (borra también cartera_entidades en cascade si hay FK)
    await client.query('DELETE FROM cartera_entidades WHERE cartera_id != $1', [carteraPrincipal.id]);
    await client.query('DELETE FROM carteras WHERE parent_id = $1', [carteraPrincipal.id]);
    console.log('✅ Subcarteras eliminadas');

    // Limpiar cartera principal: sin auxiliar, supervisor demo
    await client.query(`
      UPDATE carteras SET auxiliar_user_id = NULL, supervisor_user_id = $1 WHERE id = $2
    `, [supervisorId, carteraPrincipal.id]);

    // Agregar todos los contribuyentes a la cartera principal
    const { rows: contribuyentes } = await client.query<{ entidad_id: string }>(`
      SELECT entidad_id FROM contribuyentes
    `);

    for (const c of contribuyentes) {
      await client.query(`
        INSERT INTO cartera_entidades (cartera_id, entidad_id)
        VALUES ($1, $2)
        ON CONFLICT DO NOTHING
      `, [carteraPrincipal.id, c.entidad_id]);
    }
    console.log(`✅ ${contribuyentes.length} contribuyentes dejados en Cartera Principal`);

    // Eliminar relación auxiliar → supervisor para que se cree en el tutorial
    if (auxiliarId) {
      await client.query('DELETE FROM auxiliar_supervisores WHERE auxiliar_user_id = $1', [auxiliarId]);
      console.log('✅ Relación auxiliar → supervisor eliminada');
    }

    await client.query('COMMIT');
  } catch (err) {
    await client.query('ROLLBACK');
    throw err;
  } finally {
    client.release();
  }

  console.log('\n🎉 Demo Ventas listo para tutoriales');
  console.log('   - Cartera Principal con 6 contribuyentes, sin auxiliar');
  console.log('   - 48 obligaciones y 24 tareas sin asignar');
  console.log('   - Usuarios: owner, supervisor, auxiliar, cliente');
}

main()
  .catch((e) => {
    console.error('\n❌ Error:', e);
    process.exit(1);
  })
  .finally(async () => {
    await prisma.$disconnect();
    await tenantDb.shutdown();
  });
