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

// One scheduled meeting to seed (shown on the ministry Meeting Calendar), plus
// an optional meeting summary (shown on the ministry Meeting Summary page).
// - meetingRequestTitle: the meeting request this meeting answers.
// - ministryStakeholder: the meeting's creator is that ministry's user, so it
//   shows up for that ministry on the calendar.
type SeedMeeting = {
  meetingRequestTitle: string;
  ministryStakeholder: string;
  title: string;
  description?: string;
  meetingDate: string; // 'YYYY-MM-DD'
  startTime: string; // 'HH:MM' (24h)
  endTime: string; // 'HH:MM'
  location: string;
  status: MeetingStatus;
  // When set, also seed a meeting summary for this meeting with this status code
  // (matches a MeetingSummaryStatus.code, e.g. "DRAFT" / "SUBMITTED").
  summaryStatusCode?: 'DRAFT' | 'REVIEWED' | 'SUBMITTED' | 'COMPLETED';
};

const MEETINGS: SeedMeeting[] = [
  {
    meetingRequestTitle:
      'សំណើសុំប្រជុំស្តីពីដំណើរការចេញវិញ្ញាបនបត្រផលិតផលកសិកម្ម និងនីតិវិធីនាំចេញ',
    ministryStakeholder: 'MAFF',
    title: 'កិច្ចប្រជុំស្តីពីដំណើរការចេញវិញ្ញាបនបត្រ និងការនាំចេញផលិតផលកសិកម្ម',
    description:
      '<p>កិច្ចប្រជុំរវាងក្រសួងពាក់ព័ន្ធ និងក្រុមការងារវិស័យកសិកម្ម ដើម្បីពិភាក្សាដោះស្រាយបញ្ហាដំណើរការចេញវិញ្ញាបនបត្រ និងនីតិវិធីនាំចេញ។</p>',
    meetingDate: '2026-07-10',
    startTime: '09:00',
    endTime: '11:00',
    location: 'សាលប្រជុំក្រសួងកសិកម្ម រុក្ខាប្រមាញ់ និងនេសាទ ភ្នំពេញ',
    status: MeetingStatus.SUBMITTED,
    summaryStatusCode: 'DRAFT',
  },
];

function toMeetingDate(value: string) {
  return new Date(`${value}T00:00:00.000Z`);
}

function toMeetingTime(value: string) {
  return new Date(`1970-01-01T${value}:00.000Z`);
}

export async function seedMeetings(
  prisma: PrismaClient,
  userSeed: SeedUsersResult,
  statusIdByCode: Map<string, number>,
) {
  let seededMeetings = 0;
  let seededSummaries = 0;

  // The ministry user that belongs to each ministry stakeholder (the creator).
  const userIdByStakeholderName = new Map<string, number>();
  for (const user of userSeed.users) {
    if (user.stakeholderName) {
      userIdByStakeholderName.set(user.stakeholderName, user.id);
    }
  }

  for (const meeting of MEETINGS) {
    const meetingRequest = await prisma.meetingRequests.findFirst({
      where: { title: meeting.meetingRequestTitle, deletedAt: null },
      select: { id: true },
    });
    const creatorUserId = userIdByStakeholderName.get(
      meeting.ministryStakeholder,
    );

    if (!meetingRequest || !creatorUserId) {
      console.warn(
        `Skipping meeting "${meeting.title}" (missing meeting request or ministry user).`,
      );
      continue;
    }

    const data = {
      title: meeting.title,
      description: meeting.description ?? null,
      meetingDate: toMeetingDate(meeting.meetingDate),
      startTime: toMeetingTime(meeting.startTime),
      endTime: toMeetingTime(meeting.endTime),
      location: meeting.location,
      status: meeting.status,
      meetingRequestId: meetingRequest.id,
      userId: creatorUserId,
    };

    // Idempotent: one seeded meeting per meeting request.
    const existing = await prisma.meeting.findFirst({
      where: { meetingRequestId: meetingRequest.id, deletedAt: null },
      select: { id: true },
    });

    let meetingId: number;
    if (existing) {
      await prisma.meeting.update({ where: { id: existing.id }, data });
      meetingId = existing.id;
    } else {
      const created = await prisma.meeting.create({
        data,
        select: { id: true },
      });
      meetingId = created.id;
    }
    seededMeetings += 1;

    // Optionally seed the meeting summary for this meeting.
    if (meeting.summaryStatusCode) {
      const meetingSummaryStatusId = statusIdByCode.get(
        meeting.summaryStatusCode,
      );

      if (meetingSummaryStatusId === undefined) {
        throw new Error(
          `Unknown meeting summary status code: ${meeting.summaryStatusCode}`,
        );
      }

      const summaryData = {
        meetingRequestId: meetingRequest.id,
        meetingId,
        meetingSummaryStatusId,
        userId: creatorUserId,
      };

      const existingSummary = await prisma.meetingSummary.findFirst({
        where: { meetingId, deletedAt: null },
        select: { id: true },
      });

      if (existingSummary) {
        await prisma.meetingSummary.update({
          where: { id: existingSummary.id },
          data: summaryData,
        });
      } else {
        await prisma.meetingSummary.create({ data: summaryData });
      }
      seededSummaries += 1;
    }
  }

  return { seededMeetings, seededSummaries };
}
