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

export const GROUP_A_DRAFT_TITLE =
  '[សាកល្បង] សំណើសុំប្រជុំស្តីពីការសម្របសម្រួលការនាំចេញផលិតផលកសិកម្ម';

export async function seedGroupADraftMeetingRequest(
  prisma: PrismaClient,
  meetingRequestLetter: string,
  apply = false,
) {
  return prisma.$transaction(async (tx) => {
    if (apply) {
      await tx.$queryRaw`SELECT 1 AS locked FROM pg_advisory_xact_lock(20261030, 1)`;
    }

    const groups = await tx.stakeholder.findMany({
      where: {
        name: 'Agriculture & Agro-Industry',
        active: true,
        deletedAt: null,
        stakeholderType: { name: 'Private Sector', deletedAt: null },
      },
      select: {
        id: true,
        name: true,
        relatedStakeholder: {
          select: {
            id: true,
            name: true,
            active: true,
            deletedAt: true,
            stakeholderType: { select: { name: true } },
          },
        },
      },
    });

    if (groups.length !== 1) {
      throw new Error('Expected exactly one active Working Group A.');
    }
    const group = groups[0];
    const agency = group.relatedStakeholder;
    if (
      !agency?.active ||
      agency.deletedAt !== null ||
      agency.stakeholderType.name !== 'Ministry'
    ) {
      throw new Error('Working Group A must have an active primary ministry.');
    }

    const owners = await tx.user.findMany({
      where: {
        isActive: true,
        deletedAt: null,
        stakeholders: { some: { stakeholderId: group.id } },
        roles: {
          some: { role: { name: 'private_sector', deletedAt: null } },
        },
      },
      select: { id: true, name: true },
    });

    if (owners.length !== 1) {
      throw new Error(
        'Expected exactly one active private-sector owner for Group A.',
      );
    }
    const owner = owners[0];
    // Include deleted or submitted matches: rerunning never restores or edits them.
    const existing = await tx.meetingRequests.findFirst({
      where: { title: GROUP_A_DRAFT_TITLE, userId: owner.id },
      select: { id: true, status: true },
      orderBy: { id: 'asc' },
    });

    const details = {
      workingGroup: { id: group.id, name: group.name },
      owner,
      ministry: { id: agency.id, name: agency.name },
      title: GROUP_A_DRAFT_TITLE,
    };
    if (existing) {
      return {
        ...details,
        action: 'kept',
        requestId: existing.id,
        status: existing.status,
      };
    }
    if (!apply) {
      return {
        ...details,
        action: 'would-create',
        requestId: null,
        status: MeetingRequestStatus.DRAFT,
      };
    }

    const request = await tx.meetingRequests.create({
      data: {
        title: GROUP_A_DRAFT_TITLE,
        description:
          '<p>ទិន្នន័យសាកល្បងសម្រាប់ក្រុមការងារ ក៖ ផ្នែកកសិកម្ម កសិ-ឧស្សាហកម្ម។</p>' +
          '<p>ស្នើសុំរៀបចំកិច្ចប្រជុំជាមួយក្រសួងកសិកម្ម រុក្ខាប្រមាញ់ និងនេសាទ ដើម្បីពិភាក្សាអំពីការសម្របសម្រួលនីតិវិធីនាំចេញផលិតផលកសិកម្ម និងប្រមូលមតិយោបល់ពីភាគីពាក់ព័ន្ធ។ សំណើនេះជាសេចក្តីព្រាងសម្រាប់សាកល្បង និងមិនទាន់បានបញ្ជូនទៅក្រសួងទេ។</p>',
        userId: owner.id,
        status: MeetingRequestStatus.DRAFT,
        submittedAt: null,
        meetingRequestLetter,
        governmentAgencies: { create: { stakeholderId: agency.id } },
      },
      select: { id: true, status: true },
    });

    return {
      ...details,
      action: 'created',
      requestId: request.id,
      status: request.status,
    };
  });
}
