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

// One working group issue to seed.
// - ownerWorkingGroup: the Private Sector stakeholder that owns the issue. The
//   issue's user is the private-sector user linked to that working group.
// - status / category: looked up by name.
// - agencies: ministry stakeholder names, in order (agencyOrder = index + 1).
type SeedWorkingGroupIssue = {
  ownerWorkingGroup: string;
  title: string;
  description: string;
  recommendation: string;
  status: string;
  category: string;
  agencies: string[];
  attachment?: string;
};

const WORKING_GROUP_ISSUES: SeedWorkingGroupIssue[] = [
  {
    ownerWorkingGroup: 'Agriculture & Agro-Industry',
    title: 'ការយឺតយ៉ាវក្នុងដំណើរការចេញវិញ្ញាបនបត្រផលិតផលកសិកម្ម',
    description:
      'វិស័យឯកជនជួបប្រទះការយឺតយ៉ាវក្នុងការស្នើសុំវិញ្ញាបនបត្រសម្រាប់ផលិតផលកសិកម្ម ជាពិសេសសម្រាប់ការនាំចេញ។ ដំណើរការនេះត្រូវការឯកសារច្រើន និងការសម្របសម្រួលជាមួយស្ថាប័នពាក់ព័ន្ធជាច្រើន ដែលធ្វើឱ្យចំណាយពេលវេលាច្រើន។',
    recommendation:
      'ស្នើឱ្យមានការកែលម្អដំណើរការចេញវិញ្ញាបនបត្រ ដោយរៀបចំបញ្ជីឯកសារឱ្យច្បាស់លាស់ កាត់បន្ថយការស្នើសុំឯកសារដដែលៗ និងកំណត់រយៈពេលស្តង់ដារសម្រាប់ដំណើរការអនុម័ត។',
    status: 'New Submission',
    category: 'General',
    agencies: ['MAFF', 'MEF', 'MISTI', 'MLMUPC', 'MME'],
  },
  {
    ownerWorkingGroup: 'Agriculture & Agro-Industry',
    title: 'បញ្ហាការនាំចេញផលិតផលកសិកម្មទៅទីផ្សារអន្តរជាតិ',
    description:
      'អ្នកនាំចេញជួបប្រទះឧបសគ្គផ្នែកនីតិវិធីគយ និងស្តង់ដារសុវត្ថិភាពចំណីអាហារ ដែលធ្វើឱ្យពិបាកក្នុងការចូលទីផ្សារថ្មី។',
    recommendation:
      'បង្កើតយន្តការច្រកចេញចូលតែមួយ និងផ្តល់ការបណ្តុះបណ្តាលអំពីស្តង់ដារនាំចេញ។',
    status: 'New Submission',
    category: 'Trade',
    agencies: ['MAFF', 'MoC', 'MEF'],
  },
  {
    ownerWorkingGroup: 'Tourism',
    title: 'ការខ្វះខាតបុគ្គលិកជំនាញក្នុងវិស័យទេសចរណ៍',
    description:
      'អាជីវកម្មទេសចរណ៍ខ្វះបុគ្គលិកដែលមានជំនាញភាសា និងសេវាកម្ម ដែលប៉ះពាល់ដល់គុណភាពសេវា។',
    recommendation:
      'សហការជាមួយក្រសួងពាក់ព័ន្ធដើម្បីបង្កើតកម្មវិធីបណ្តុះបណ្តាលជំនាញវិជ្ជាជីវៈទេសចរណ៍។',
    status: 'New Submission',
    category: 'Human Resources',
    agencies: ['MoT', 'MoEYS', 'MoLVT'],
  },
  {
    ownerWorkingGroup: 'Manufacturing & SMEs',
    title: 'ការលំបាកក្នុងការទទួលបានហិរញ្ញប្បទានសម្រាប់សហគ្រាសធុនតូច និងមធ្យម',
    description:
      'សហគ្រាសធុនតូច និងមធ្យមជួបការលំបាកក្នុងការទទួលបានកម្ចីដោយសារតម្រូវការទ្រព្យបញ្ចាំខ្ពស់។',
    recommendation:
      'បង្កើតមូលនិធិធានាឥណទាន និងសម្រួលលក្ខខណ្ឌកម្ចីសម្រាប់ SMEs។',
    status: 'Saved',
    category: 'Finance',
    agencies: ['MISTI', 'MEF', 'NBC'],
  },
  {
    ownerWorkingGroup: 'Banking and Financial Services',
    title: 'ការអនុវត្តបទប្បញ្ញត្តិថ្មីស្តីពីសេវាហិរញ្ញវត្ថុឌីជីថល',
    description:
      'ស្ថាប័នហិរញ្ញវត្ថុត្រូវការភាពច្បាស់លាស់បន្ថែមអំពីបទប្បញ្ញត្តិសម្រាប់សេវាឌីជីថលថ្មីៗ។',
    recommendation:
      'រៀបចំសិក្ខាសាលាបំភ្លឺ និងចេញសេចក្តីណែនាំជាក់លាក់សម្រាប់ការអនុវត្ត។',
    status: 'Saved',
    category: 'Regulation',
    agencies: ['NBC', 'MEF'],
  },

  // --- "Saved" issues (not yet attached to any meeting request) ---
  // These are selectable in the meeting-request "Issue List" because only
  // Saved + unlinked issues are offered there. Keep them OUT of the
  // meeting-request seed's issueTitles so they stay unlinked.
  {
    ownerWorkingGroup: 'Agriculture & Agro-Industry',
    title: 'ការខ្វះខាតឃ្លាំងត្រជាក់សម្រាប់រក្សាទុកផលិតផលកសិកម្ម',
    description:
      'កសិករ និងអ្នកនាំចេញខ្វះខាតឃ្លាំងត្រជាក់ និងហេដ្ឋារចនាសម្ព័ន្ធរក្សាទុក ដែលធ្វើឱ្យផលិតផលខូចខាតមុនពេលដល់ទីផ្សារ។',
    recommendation:
      'លើកទឹកចិត្តការវិនិយោគលើឃ្លាំងត្រជាក់ និងផ្តល់ការគាំទ្រផ្នែកហិរញ្ញវត្ថុដល់វិស័យឯកជន។',
    status: 'Saved',
    category: 'Infrastructure',
    agencies: ['MAFF', 'MEF'],
  },
  {
    ownerWorkingGroup: 'Agriculture & Agro-Industry',
    title: 'ចូលរួមសហគមន៍កសិកម្មទំនើប',
    description:
      'ផ្នែកឯកជនមើលឃើញអំពីកង្វះការយល់ដឹងរបស់កសិករលើការធ្វើផែនការ ក្នុងការផលិត ដាំដុះ ថវិកា និងការវិភាគការចំណាយលើថ្លៃដើមផលិត ដែលធ្វើអោយកសិករតែងតែលើកឡើងថាពួកគាត់ខាត។ ដូច្នេះផ្នែកឯកជនយល់ឃើញថាការចូលរួមជាមួយ សហគមន៍កសិកម្មទំនើប ដែលជាយន្តការបស់ក្រសួងកសិកម្ម រុក្ខាប្រមាញ់ និងនេសាទ គឺជារឿងចាំបាច់ ទាំងផ្នែកឯកជន ទាំងកសិករផ្ទាល់ ជាពិសេសការចូលរួមផ្គត់ផ្គង់ធាតុចូលកសិកម្ម ក្នុងផ្នែកណាមួយដល់កសិករក្នុងសហគមន៍។',
    recommendation:
      'ផ្នែកឯកជនស្នើសុំក្រសួងកសិកម្មរុក្ខាប្រមាញ់ និងនេសាទធ្វើបទបង្ហាញអំពីនីតិវិធី និងលក្ខខណ្ឌតម្រូវក្នុងការចូលរួមផ្គត់ផ្គង់ធាតុចូលកសិកម្ម ដល់សហគមន៍កសិកម្មទំនើបដល់ផ្នែកឯកជន ដែលជាអ្នកផ្គត់ផ្គង់ធាតុចូលកសិកម្ម។',
    status: 'Draft',
    category: 'Procedure',
    agencies: ['MAFF', 'MoC'],
  },
];

export async function seedWorkingGroupIssues(
  prisma: PrismaClient,
  userSeed: SeedUsersResult,
) {
  const seededTitles: string[] = [];

  // Look up a stakeholder id by its name (working group or ministry).
  const stakeholderIdByName = new Map<string, number>();
  const stakeholders = await prisma.stakeholder.findMany({
    where: { deletedAt: null },
    select: { id: true, name: true },
  });
  for (const stakeholder of stakeholders) {
    stakeholderIdByName.set(stakeholder.name, stakeholder.id);
  }

  // Look up issue status / category ids by name.
  const statusIdByName = new Map<string, number>();
  const statuses = await prisma.issueStatuses.findMany({
    where: { deletedAt: null },
    select: { id: true, name: true },
  });
  for (const status of statuses) {
    statusIdByName.set(status.name, status.id);
  }

  const categoryIdByName = new Map<string, number>();
  const categories = await prisma.categories.findMany({
    where: { deletedAt: null },
    select: { id: true, name: true },
  });
  for (const category of categories) {
    categoryIdByName.set(category.name, category.id);
  }

  // Look up the private-sector user that belongs to each working group.
  const userIdByStakeholderName = new Map<string, number>();
  for (const user of userSeed.users) {
    if (user.stakeholderName) {
      userIdByStakeholderName.set(user.stakeholderName, user.id);
    }
  }

  for (const issue of WORKING_GROUP_ISSUES) {
    const ownerStakeholderId = stakeholderIdByName.get(issue.ownerWorkingGroup);
    const userId = userIdByStakeholderName.get(issue.ownerWorkingGroup);
    const issueStatusId = statusIdByName.get(issue.status);
    const categoryId = categoryIdByName.get(issue.category);

    // Skip the issue if any required reference is missing.
    if (!ownerStakeholderId || !userId || !issueStatusId || !categoryId) {
      console.warn(
        `Skipping working group issue "${issue.title}" (missing owner, user, status, or category).`,
      );
      continue;
    }

    // Resolve the ministry agencies, keeping only the ones that exist.
    const agencyStakeholderIds = issue.agencies
      .map((name) => stakeholderIdByName.get(name))
      .filter((id): id is number => typeof id === 'number');

    // Idempotent: reuse an existing issue with the same title + owner.
    const existing = await prisma.issues.findFirst({
      where: {
        title: issue.title,
        stakeholderId: ownerStakeholderId,
        deletedAt: null,
      },
      select: { id: true },
    });

    const data = {
      title: issue.title,
      description: issue.description,
      recommendation: issue.recommendation,
      attachment: issue.attachment ?? null,
      issueStatusId,
      categoryId,
      userId,
      stakeholderId: ownerStakeholderId,
    };

    let issueId: number;

    if (existing) {
      await prisma.issues.update({ where: { id: existing.id }, data });
      issueId = existing.id;

      // Reset the agency list so re-seeding stays consistent.
      await prisma.governmentAgencyIssue.deleteMany({
        where: { issueId },
      });
    } else {
      const created = await prisma.issues.create({
        data,
        select: { id: true },
      });
      issueId = created.id;
    }

    // (Re)create the ordered government agencies for this issue.
    if (agencyStakeholderIds.length > 0) {
      await prisma.governmentAgencyIssue.createMany({
        data: agencyStakeholderIds.map((stakeholderId, index) => ({
          issueId,
          stakeholderId,
          agencyOrder: index + 1,
        })),
        skipDuplicates: true,
      });
    }

    seededTitles.push(issue.title);
  }

  return { seededTitles };
}
