import { PrismaClient } from '@prisma/client';
import { Role, PortalType, ROLE_PORTAL_MAP, ROLE_DESCRIPTIONS } from '@saferoute/constants';

const prisma = new PrismaClient();

async function main() {
  console.log('Seeding SafeRoute database...\n');

  console.log('Seeding roles...');
  const roleValues = Object.values(Role);

  for (const roleName of roleValues) {
    const existing = await prisma.roleModel.findUnique({ where: { name: roleName } });
    if (!existing) {
      await prisma.roleModel.create({
        data: {
          name: roleName,
          description: ROLE_DESCRIPTIONS[roleName],
          portalType: ROLE_PORTAL_MAP[roleName],
        },
      });
      console.log(`  Created role: ${roleName} (${ROLE_PORTAL_MAP[roleName]})`);
    } else {
      console.log(`  Role already exists: ${roleName}`);
    }
  }

  console.log('\nCreating default OWNER user...');
  const ownerPhone = process.env.OWNER_PHONE || '+919999999999';

  let ownerUser = await prisma.user.findUnique({ where: { phone: ownerPhone } });
  if (!ownerUser) {
    ownerUser = await prisma.user.create({
      data: {
        phone: ownerPhone,
        fullName: 'Platform Owner',
        isActive: true,
      },
    });
    console.log(`  Created OWNER user: ${ownerPhone}`);
  } else {
    console.log(`  OWNER user already exists: ${ownerPhone}`);
  }

  const ownerRole = await prisma.roleModel.findUnique({ where: { name: Role.OWNER } });
  if (ownerRole) {
    const existingAssignment = await prisma.userRole.findFirst({
      where: { userId: ownerUser.id, roleId: ownerRole.id },
    });
    if (!existingAssignment) {
      await prisma.userRole.create({
        data: {
          userId: ownerUser.id,
          roleId: ownerRole.id,
        },
      });
      console.log(`  Assigned OWNER role to user`);
    } else {
      console.log(`  OWNER role already assigned`);
    }
  }

  console.log('\nSeeding completed successfully!\n');
}

main()
  .then(async () => {
    await prisma.$disconnect();
  })
  .catch(async (e) => {
    console.error('Seeding failed:', e);
    await prisma.$disconnect();
    process.exit(1);
  });
