// Links an existing user (signed up through Firebase) to an organization and role.
// Usage: npm run db:assign-user -- <email> <organization code> <role name>
//   e.g. npm run db:assign-user -- you@example.com eastfield organization-admin
import prisma from '../src/config/db.js';
import logger from '../src/config/logger.js';

async function main() {
  const [email, organizationCode, roleName] = process.argv.slice(2);
  if (!email || !organizationCode || !roleName) {
    throw new Error('Usage: npm run db:assign-user -- <email> <organization code> <role name>');
  }

  const user = await prisma.user.findUnique({ where: { email: email.toLowerCase() } });
  if (!user) throw new Error(`No user with email ${email}. Sign up (POST /api/v1/auth/signup) or sign in once first.`);
  const organization = await prisma.organization.findUnique({ where: { code: organizationCode } });
  if (!organization) throw new Error(`No organization with code ${organizationCode}. Run npm run db:seed for the demo one.`);
  const role = await prisma.role.findUnique({ where: { name: roleName } });
  if (!role) throw new Error(`No role named ${roleName}.`);

  // Tenant roles live in user_roles; users.role_id stays the platform role.
  await prisma.user.update({ where: { id: user.id }, data: { organizationId: organization.id } });
  await prisma.userRole.upsert({
    where: { userId_roleId: { userId: user.id, roleId: role.id } },
    update: {},
    create: { userId: user.id, roleId: role.id },
  });
  logger.info(`${email} → ${organization.name} as ${role.label ?? role.name}`);
}

main()
  .catch((error) => {
    logger.error('Assign user failed', { message: error instanceof Error ? error.message : String(error) });
    process.exitCode = 1;
  })
  .finally(async () => {
    await prisma.$disconnect();
  });
