import type { PrismaClient } from '../../src/generated/prisma/client';

// English abbreviation, Khmer abbreviation, full Khmer name (Excel order).
const ministryNames = [
  ['MoLVT', 'ក.ក.ប.', 'ក្រសួងការងារនិងបណ្ដុះបណ្ដាលវិជ្ជាជីវៈ'],
  ['MLMUPC', 'ក.ដ.ន.ស.', 'ក្រសួងរៀបចំដែនដី នគរូបនីយកម្ម និងសំណង់'],
  ['MoT', 'ក.ទ.ច.', 'ក្រសួងទេសចរណ៍'],
  ['MoI', 'ក.ម.ផ.', 'ក្រសួងមហាផ្ទៃ'],
  ['MME', 'ក.រ.ថ.', 'ក្រសួងរ៉ែនិងថាមពល'],
  ['MAFF', 'ក.ស.ក.', 'ក្រសួងកសិកម្ម រុក្ខាប្រមាញ់ និងនេសាទ'],
  ['MPWT', 'ក.ស.ក.ដ.', 'ក្រសួងសាធារណការនិងដឹកជញ្ជូន'],
  ['MEF', 'ក.ស.ហ.វ.', 'ក្រសួងសេដ្ឋកិច្ចនិងហិរញ្ញវត្ថុ'],
  ['CDC', 'ក.អ.ក.', 'ក្រុមប្រឹក្សាអភិវឌ្ឍន៍កម្ពុជា'],
  [
    'MISTI',
    'ក.ឧ.វ.ប.ន.',
    'ក្រសួងឧស្សាហកម្ម វិទ្យាសាស្ត្រ បច្ចេកវិទ្យា និងនវានុវត្តន៍',
  ],
  ['NBC', 'ធ.ក.', 'ធនាគារជាតិនៃកម្ពុជា'],
  ['SHV Admin', 'រ.ខ.ព.', 'រដ្ឋបាលខេត្តព្រះសីហនុ'],
  ['GDCE', 'អ.គ.រ.', 'អគ្គនាយកដ្ឋានគយនិងរដ្ឋាករកម្ពុជា'],
  ['GDT', 'អ.ព.ដ.', 'អគ្គនាយកដ្ឋានពន្ធដារ'],
] as const;

export function seedMinistryKhmerNames(prisma: PrismaClient, apply = false) {
  return prisma.$transaction(
    async (tx) => {
      const results = [];
      for (const [name, khAbbreviation, khName] of ministryNames) {
        const matches = await tx.stakeholder.findMany({
          where: { name, stakeholderType: { name: 'Ministry' } },
          select: {
            id: true,
            khAbbreviation: true,
            khName: true,
            deletedAt: true,
            stakeholderType: { select: { deletedAt: true } },
          },
        });
        const [ministry] = matches;
        let status: string;
        if (!ministry) status = 'missing';
        else if (matches.length !== 1) status = 'ambiguous';
        else if (ministry.deletedAt || ministry.stakeholderType.deletedAt)
          status = 'deleted';
        else if (
          ministry.khName === khName &&
          ministry.khAbbreviation === khAbbreviation
        )
          status = 'unchanged';
        else {
          status = apply ? 'updated' : 'would update';
          if (apply) {
            await tx.stakeholder.update({
              where: { id: ministry.id },
              data: { khName, khAbbreviation },
            });
          }
        }
        results.push({ name, status });
      }
      return results;
    },
    { isolationLevel: 'Serializable' },
  );
}
