import { promises as fs } from 'fs';
import path from 'path';
import prisma from '../src/config/db';

const dataDirectory = path.resolve(__dirname, '../data');
const adminEmail = 'admin@dentaflow.local';

const resetArrayFile = async (fileName: string) => {
  await fs.mkdir(dataDirectory, { recursive: true });
  await fs.writeFile(path.join(dataDirectory, fileName), '[]\n');
};

const resetObjectFile = async (fileName: string, value: unknown) => {
  await fs.mkdir(dataDirectory, { recursive: true });
  await fs.writeFile(path.join(dataDirectory, fileName), `${JSON.stringify(value, null, 2)}\n`);
};

const clearLocalFallbackData = async () => {
  await Promise.all([
    resetArrayFile('agent-dental-knowledge-audit.json'),
    resetArrayFile('agent-dental-knowledge-versions.json'),
    resetArrayFile('agent-dental-knowledge.json'),
    resetArrayFile('appointment-reminder-deliveries.json'),
    resetArrayFile('appointments.json'),
    resetArrayFile('budgets.json'),
    resetArrayFile('communication-logs.json'),
    resetArrayFile('document-issues.json'),
    resetArrayFile('document-sequences.json'),
    resetArrayFile('inventory.json'),
    resetArrayFile('notification-feed.json'),
    resetArrayFile('odontogram.json'),
    resetArrayFile('password-recovery-requests.json'),
    resetArrayFile('patient-attachments.json'),
    resetArrayFile('patients.json'),
    resetArrayFile('patient-portal-access.json'),
    resetArrayFile('recipes.json'),
    resetArrayFile('transactions.json'),
    resetArrayFile('treatments.json'),
  ]);
};

async function main() {
  console.log('Limpiando datos demo de PostgreSQL y almacenamiento local...');

  await prisma.$transaction(async (tx) => {
    await tx.patientPortalAccess.deleteMany();
    await tx.cita.deleteMany();
    await tx.presupuestoItem.deleteMany();
    await tx.presupuesto.deleteMany();
    await tx.medicamentoReceta.deleteMany();
    await tx.receta.deleteMany();
    await tx.odontogramaPieza.deleteMany();
    await tx.transaccion.deleteMany();
    await tx.documentIssue.deleteMany();
    await tx.documentSequence.deleteMany();
    await tx.alerta.deleteMany();
    await tx.producto.deleteMany();
    await tx.doctorScheduleOverride.deleteMany();
    await tx.doctorSchedule.deleteMany();
    await tx.tratamiento.deleteMany();
    await tx.paciente.deleteMany();
    await tx.user.deleteMany({
      where: {
        email: {
          not: adminEmail,
        },
      },
    });
  });

  await clearLocalFallbackData();

  const adminUser = await prisma.user.findUnique({
    where: { email: adminEmail },
  });

  if (!adminUser) {
    await prisma.user.create({
      data: {
        email: adminEmail,
        password: 'admin123',
        name: 'Administrador',
        role: 'ADMIN',
        active: true,
      },
    });
  } else {
    await prisma.user.update({
      where: { email: adminEmail },
      data: {
        active: true,
      },
    });
  }

  await resetObjectFile('users.json', [
    {
      id: 'bootstrap-admin',
      email: adminEmail,
      password: 'admin123',
      name: 'Administrador',
      role: 'ADMIN',
      active: true,
      createdAt: new Date().toISOString(),
      updatedAt: new Date().toISOString(),
    },
  ]);

  console.log('Limpieza completada.');
  console.log('Se mantuvo solo el acceso bootstrap: admin@dentaflow.local / admin123');
}

main()
  .catch((error) => {
    console.error('Error limpiando datos demo:', error);
    process.exit(1);
  })
  .finally(async () => {
    await prisma.$disconnect();
  });
