import * as bcrypt from 'bcrypt';
import type { PrismaClient } from '../../src/generated/prisma/client';
import { SUPER_ADMIN_ROLE, type SeedRoleMap } from './role.seed';

const DEFAULT_AVATAR_URL =
  'https://pbs.twimg.com/profile_images/1593304942210478080/TUYae5z7_400x400.jpg';

type SeedUser = {
  role: string;
  email: string;
  password: string;
  name: string;
  position: string;
  stakeholderName?: string;
};

export type SeededUser = {
  id: number;
  role: string;
  email: string;
  name: string;
  position: string;
  stakeholderName?: string;
};

export type SeedUsersResult = {
  ownerUserId: number | null;
  users: SeededUser[];
};

// One login account per role (for first login / testing). Override via env.
const SEED_USERS: SeedUser[] = [
  {
    role: 'admin',
    email: process.env.SEED_ADMIN_EMAIL ?? 'admin@gmail.com',
    password: process.env.SEED_ADMIN_PASSWORD ?? '12345678',
    name: process.env.SEED_ADMIN_NAME ?? 'Admin',
    position: process.env.SEED_ADMIN_POSITION ?? 'ADMIN',
  },
  {
    role: 'guest',
    email: 'guest1@gmail.com',
    password: '12345678',
    name: 'Guest 1',
    position: 'Guest',
  },
  {
    role: 'guest',
    email: 'guest2@gmail.com',
    password: '12345678',
    name: 'Guest 2',
    position: 'Guest',
  },
  {
    role: 'cdc_g-psf',
    email: 'cdcgpsf@gmail.com',
    password: '12345678',
    name: 'The Damselette',
    position: 'CDC G-PSF Secretariat ',
  },
  {
    role: 'ministry',
    email: 'chhelorngkeasela@gmail.com',
    password: '12345678',
    name: 'The Damselette',
    position: 'CDC G-PSF Secretariat ',
  },
  {
    role: 'cdc',
    email: 'cdc@gmail.com',
    password: '12345678',
    name: 'The Jester',
    position: 'CDC Secretariat',
  },
  {
    role: 'cefp',
    email: 'cefp@gmail.com',
    password: '12345678',
    name: 'Signora',
    position: 'CEFP Secretariat',
  },
  // Private Sector1 User => Agriculture & Agro-Industry
  {
    role: 'private_sector',
    email: 'privatesector1@gmail.com',
    password: '12345678',
    name: 'Jame Sok',
    position: 'Software Engineer',
    stakeholderName: 'Agriculture & Agro-Industry',
  },
  // Private Sector2 User => Tourism
  {
    role: 'private_sector',
    email: 'privatesector2@gmail.com',
    password: '12345678',
    name: 'Narong',
    position: 'Tourism',
    stakeholderName: 'Tourism',
  },
  // Private Sector 3 User =>  Manufacturing & SMEs
  {
    role: 'private_sector',
    email: 'privatesector3@gmail.com',
    password: '12345678',
    name: 'Rithy Heng',
    position: 'Manufacturing & SMEs',
    stakeholderName: 'Manufacturing & SMEs',
  },
  // Private Sector 4 User => MEF
  {
    role: 'private_sector',
    email: 'privatesector4@gmail.com',
    password: '12345678',
    name: 'Chan Sophea',
    position: 'Law, Tax, and Governance',
    stakeholderName: 'Law, Tax, and Governance',
  },
  // Private Sector 5 User => NBC
  {
    role: 'private_sector',
    email: 'privatesector5@gmail.com',
    password: '12345678',
    name: 'Ly Sovannara',
    position: 'Banking and Financial Services',
    stakeholderName: 'Banking and Financial Services',
  },
  // Private Sector 6 User => MPWT
  {
    role: 'private_sector',
    email: 'privatesector6@gmail.com',
    password: '12345678',
    name: 'Heng Chandara',
    position: 'Transport and Infrastructure',
    stakeholderName: 'Transport and Infrastructure',
  },
  // Private Sector 7 User => MoC
  {
    role: 'private_sector',
    email: 'privatesector7@gmail.com',
    password: '12345678',
    name: 'Mao Sopheak',
    position: 'Export Processing and Trade Facilitation',
    stakeholderName: 'Export Processing and Trade Facilitation',
  },
  // Private Sector 8 User => MoLVT
  {
    role: 'private_sector',
    email: 'privatesector8@gmail.com',
    password: '12345678',
    name: 'Kim Sreynich',
    position: 'Industrial Relations',
    stakeholderName: 'Industrial Relations',
  },

  // Private Sector 9 User => MAFF
  {
    role: 'private_sector',
    email: 'privatesector9@gmail.com',
    password: '12345678',
    name: 'Chhay Vannak',
    position: 'Rice and Paddy',
    stakeholderName: 'Rice and Paddy',
  },

  // Private Sector 10 User => MME
  {
    role: 'private_sector',
    email: 'privatesector10@gmail.com',
    password: '12345678',
    name: 'Pech Socheata',
    position: 'Energy and Mineral Resources',
    stakeholderName: 'Energy and Mineral Resources',
  },

  // Private Sector 11 User => MoEYS
  {
    role: 'private_sector',
    email: 'privatesector11@gmail.com',
    password: '12345678',
    name: 'Noun Daravuth',
    position: 'Education',
    stakeholderName: 'Education',
  },
  // Private Sector12 User => Health
  {
    role: 'private_sector',
    email: 'privatesector12@gmail.com',
    password: '12345678',
    name: 'Pen Sovann',
    position: 'Health',
    stakeholderName: 'Health',
  },
  // Private Sector 13 User => MLMUPC
  {
    role: 'private_sector',
    email: 'privatesector13@gmail.com',
    password: '12345678',
    name: 'Seng Bunthoeun',
    position: 'Construction and Real Estate',
    stakeholderName: 'Construction and Real Estate',
  },

  // Private Sector 14 User => NBFSA
  {
    role: 'private_sector',
    email: 'privatesector14@gmail.com',
    password: '12345678',
    name: 'Pov Sovannara',
    position: 'Non-Bank Financial Services',
    stakeholderName: 'Non-Bank Financial Services',
  },
  // Ministry1 User => MAFF
  {
    role: 'ministry',
    email: 'ministry1@gmail.com',
    password: '12345678',
    name: 'Chea Rithy',
    position: 'MAFF',
    stakeholderName: 'MAFF',
  },

  // Ministry2 User => Tourism
  {
    role: 'ministry',
    email: 'ministry2@gmail.com',
    password: '12345678',
    name: 'Ou Socheata',
    position: 'Ministry of Tourism',
    stakeholderName: 'MoT',
  },
  // Ministry3 User => MISTI
  {
    role: 'ministry',
    email: 'ministry3@gmail.com',
    password: '12345678',
    name: 'Kim Sopheap',
    position: 'Ministry of Manufacturing & SMEs',
    stakeholderName: 'MISTI',
  },
  // Ministry4 User => MEF
  {
    role: 'ministry',
    email: 'ministry4@gmail.com',
    password: '12345678',
    name: 'Keo Sovanna',
    position: 'MEF',
    stakeholderName: 'MEF',
  },
  // Ministry5 User => NBC
  {
    role: 'ministry',
    email: 'ministry5@gmail.com',
    password: '12345678',
    name: 'Ros Chantha',
    position: 'NBC',
    stakeholderName: 'NBC',
  },
  // Ministry6 User => MPWT
  {
    role: 'ministry',
    email: 'ministry6@gmail.com',
    password: '12345678',
    name: 'Tep Sopheara',
    position: 'MPWT',
    stakeholderName: 'MPWT',
  },
  // Ministry7 User => MoC
  {
    role: 'ministry',
    email: 'ministry7@gmail.com',
    password: '12345678',
    name: 'Sok Mean',
    position: 'MoC',
    stakeholderName: 'MoC',
  },
  // Ministry8 User => MoLVT
  {
    role: 'ministry',
    email: 'ministry8@gmail.com',
    password: '12345678',
    name: 'Meas Vicheka',
    position: 'MoLVT',
    stakeholderName: 'MoLVT',
  },
  // Ministry10 User => MME
  {
    role: 'ministry',
    email: 'ministry10@gmail.com',
    password: '12345678',
    name: 'Phan Makara',
    position: 'MME',
    stakeholderName: 'MME',
  },

  // Ministry11 User => MoEYS
  {
    role: 'ministry',
    email: 'ministry11@gmail.com',
    password: '12345678',
    name: 'Nhem Kosal',
    position: 'MoEYS',
    stakeholderName: 'MoEYS',
  },
  // Ministry12 User => MoH
  {
    role: 'ministry',
    email: 'ministry12@gmail.com',
    password: '12345678',
    name: 'Long Sreynich',
    position: 'MoH',
    stakeholderName: 'MoH',
  },
  // Ministry13 User => MLMUPC
  {
    role: 'ministry',
    email: 'ministry13@gmail.com',
    password: '12345678',
    name: 'Pen Sothea',
    position: 'MLMUPC',
    stakeholderName: 'MLMUPC',
  },
  // Ministry14 User => NBFSA
  {
    role: 'ministry',
    email: 'ministry14@gmail.com',
    password: '12345678',
    name: 'Pham Sophorn',
    position: 'NBFSA',
    stakeholderName: 'NBFSA',
  },
  {
    role: 'ministry',
    email: 'chhelangkeasela@gmail.com',
    password: '12345678',
    name: 'sela',
    position: 'developer',
    stakeholderName: 'MAFF',
  },
];

export async function seedUsers(
  prisma: PrismaClient,
  rolesByName: SeedRoleMap,
): Promise<SeedUsersResult> {
  console.log('Seeded accounts (passwords only shown on seed):');

  let ownerUserId: number | null = null;
  const users: SeededUser[] = [];

  for (const seedUser of SEED_USERS) {
    const role = rolesByName.get(seedUser.role);
    if (!role) continue;

    const passwordHash = await bcrypt.hash(seedUser.password, 10);
    const user = await prisma.user.upsert({
      where: { email: seedUser.email },
      update: {
        password: passwordHash,
        name: seedUser.name,
        position: seedUser.position,
        avatar: DEFAULT_AVATAR_URL,
        isActive: true,
        deletedAt: null,
      },
      create: {
        email: seedUser.email,
        password: passwordHash,
        name: seedUser.name,
        position: seedUser.position,
        avatar: DEFAULT_AVATAR_URL,
      },
      select: { id: true, email: true },
    });

    if (seedUser.role === SUPER_ADMIN_ROLE) {
      ownerUserId = user.id;
    }

    await prisma.userHasRoles.upsert({
      where: { userId_roleId: { userId: user.id, roleId: role.id } },
      update: {},
      create: { userId: user.id, roleId: role.id },
    });

    users.push({
      id: user.id,
      role: seedUser.role,
      email: user.email,
      name: seedUser.name,
      position: seedUser.position,
      stakeholderName: seedUser.stakeholderName,
    });

    console.log(
      `  ${seedUser.role.padEnd(9)} ${user.email.padEnd(22)} password: ${seedUser.password}`,
    );
  }

  if (!ownerUserId) {
    const firstUser = await prisma.user.findFirst({
      where: { deletedAt: null },
      orderBy: { id: 'asc' },
      select: { id: true },
    });
    ownerUserId = firstUser?.id ?? null;
  }

  return {
    ownerUserId,
    users,
  };
}
