import { hash } from 'bcryptjs';
import { PrismaClient, UserStatus } from '@prisma/client';

const prisma = new PrismaClient();

const permissions = [
  { key: 'permissions.read', label: 'Read Permissions', module: 'permissions' },
  { key: 'users.read', label: 'Read Users', module: 'users' },
  { key: 'users.write', label: 'Write Users', module: 'users' },
  { key: 'roles.read', label: 'Read Roles', module: 'roles' },
  { key: 'roles.write', label: 'Write Roles', module: 'roles' },
  { key: 'departments.read', label: 'Read Departments', module: 'departments' },
  { key: 'departments.write', label: 'Write Departments', module: 'departments' },
  { key: 'questions.read', label: 'Read Questions', module: 'questions' },
  { key: 'questions.write', label: 'Write Questions', module: 'questions' },
  { key: 'templates.read', label: 'Read Templates', module: 'templates' },
  { key: 'templates.write', label: 'Write Templates', module: 'templates' },
  { key: 'campaigns.read', label: 'Read Campaigns', module: 'campaigns' },
  { key: 'campaigns.write', label: 'Write Campaigns', module: 'campaigns' },
  { key: 'assignments.read', label: 'Read Assignments', module: 'assignments' },
  { key: 'assignments.write', label: 'Write Assignments', module: 'assignments' },
  { key: 'reports.read', label: 'Read Reports', module: 'reports' },
];

async function main() {
  const adminPasswordHash = await hash('Admin@12345', 10);
  const systemPasswordHash = await hash('System@12345', 10);

  for (const permission of permissions) {
    await prisma.permission.upsert({
      where: { key: permission.key },
      update: {
        label: permission.label,
        module: permission.module,
        deletedAt: null,
        updatedBy: 'seed',
      },
      create: {
        ...permission,
        createdBy: 'seed',
        updatedBy: 'seed',
      },
    });
  }

  const hrDepartment = await prisma.department.upsert({
    where: { code: 'HR' },
    update: {
      name: 'Human Resources',
      description: 'Human Resources Department',
      deletedAt: null,
      updatedBy: 'seed',
    },
    create: {
      code: 'HR',
      name: 'Human Resources',
      description: 'Human Resources Department',
      createdBy: 'seed',
      updatedBy: 'seed',
    },
  });

  const adminRole = await prisma.role.upsert({
    where: { slug: 'admin' },
    update: {
      name: 'Admin',
      description: 'Full management access',
      deletedAt: null,
      updatedBy: 'seed',
    },
    create: {
      slug: 'admin',
      name: 'Admin',
      description: 'Full management access',
      createdBy: 'seed',
      updatedBy: 'seed',
    },
  });

  const systemRole = await prisma.role.upsert({
    where: { slug: 'system' },
    update: {
      name: 'System',
      description: 'Automated internal jobs',
      deletedAt: null,
      updatedBy: 'seed',
    },
    create: {
      slug: 'system',
      name: 'System',
      description: 'Automated internal jobs',
      createdBy: 'seed',
      updatedBy: 'seed',
    },
  });

  const allPermissions = await prisma.permission.findMany({
    where: {
      deletedAt: null,
    },
  });

  for (const permission of allPermissions) {
    await prisma.rolePermission.upsert({
      where: {
        roleId_permissionId: {
          roleId: adminRole.id,
          permissionId: permission.id,
        },
      },
      update: {
        deletedAt: null,
        updatedBy: 'seed',
      },
      create: {
        roleId: adminRole.id,
        permissionId: permission.id,
        createdBy: 'seed',
        updatedBy: 'seed',
      },
    });
  }

  await prisma.user.upsert({
    where: { email: 'system@aechr.local' },
    update: {
      employeeCode: 'SYSTEM',
      name: 'SYSTEM',
      passwordHash: systemPasswordHash,
      roleId: systemRole.id,
      departmentId: hrDepartment.id,
      designation: 'System',
      status: UserStatus.ACTIVE,
      deletedAt: null,
      updatedBy: 'seed',
    },
    create: {
      employeeCode: 'SYSTEM',
      name: 'SYSTEM',
      email: 'system@aechr.local',
      passwordHash: systemPasswordHash,
      roleId: systemRole.id,
      departmentId: hrDepartment.id,
      designation: 'System',
      status: UserStatus.ACTIVE,
      createdBy: 'seed',
      updatedBy: 'seed',
    },
  });

  await prisma.user.upsert({
    where: { email: 'admin@aechr.local' },
    update: {
      employeeCode: 'EMP-ADMIN-001',
      name: 'Portal Admin',
      passwordHash: adminPasswordHash,
      roleId: adminRole.id,
      departmentId: hrDepartment.id,
      designation: 'HR Admin',
      status: UserStatus.ACTIVE,
      deletedAt: null,
      updatedBy: 'seed',
    },
    create: {
      employeeCode: 'EMP-ADMIN-001',
      name: 'Portal Admin',
      email: 'admin@aechr.local',
      passwordHash: adminPasswordHash,
      roleId: adminRole.id,
      departmentId: hrDepartment.id,
      designation: 'HR Admin',
      status: UserStatus.ACTIVE,
      createdBy: 'seed',
      updatedBy: 'seed',
    },
  });

  console.log('Seed completed.');
  console.log('Admin login: admin@aechr.local / Admin@12345');
}

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