import { Injectable } from '@nestjs/common';

import { Prisma } from '@/generated/prisma/client';
import { PrismaService } from '@/prisma/prisma.service';

const cefpIssueMatrixSelect = {
  id: true,
  issueId: true,
  meetingSummaryId: true,
  rgcDecision: true,
  nextStep: true,
  meetingSummary: {
    select: {
      updatedAt: true,
    },
  },
  issueStatus: {
    select: {
      id: true,
      code: true,
      name: true,
    },
  },
  issue: {
    select: {
      id: true,
      title: true,
      description: true,
      recommendation: true,
      category: {
        select: {
          id: true,
          name: true,
        },
      },
      issueStatus: {
        select: {
          id: true,
          code: true,
          name: true,
        },
      },
      stakeholder: {
        select: {
          id: true,
          name: true,
        },
      },
      governmentAgencies: {
        where: {
          stakeholder: {
            deletedAt: null,
          },
        },
        orderBy: {
          agencyOrder: 'asc',
        },
        select: {
          agencyOrder: true,
          stakeholder: {
            select: {
              id: true,
              name: true,
              logo: true,
            },
          },
        },
      },
    },
  },
} as const satisfies Prisma.IssueResolvesSelect;

export type SubmittedCefpIssueResolve = Prisma.IssueResolvesGetPayload<{
  select: typeof cefpIssueMatrixSelect;
}>;

@Injectable()
export class CefpIssueMatrixRepository {
  constructor(private readonly prisma: PrismaService) {}

  /**
   * Return submitted CEFP escalations newest first. The service keeps only the
   * first row for each issue, which makes the latest submission authoritative.
   */
  findSubmittedCefpIssueResolves(): Promise<SubmittedCefpIssueResolve[]> {
    return this.prisma.issueResolves.findMany({
      where: {
        deletedAt: null,
        escalate: {
          is: {
            name: {
              equals: 'CEFP',
              mode: 'insensitive',
            },
            deletedAt: null,
          },
        },
        meetingSummary: {
          deletedAt: null,
          meetingSummaryStatus: {
            code: 'SUBMITTED',
            deletedAt: null,
          },
          user: {
            deletedAt: null,
            roles: {
              some: {
                role: {
                  name: 'ministry',
                  deletedAt: null,
                },
              },
            },
          },
        },
        issueStatus: {
          is: {
            deletedAt: null,
          },
        },
        issue: {
          deletedAt: null,
          category: {
            deletedAt: null,
          },
          issueStatus: {
            deletedAt: null,
          },
          stakeholder: {
            deletedAt: null,
          },
        },
      },
      select: cefpIssueMatrixSelect,
      orderBy: [
        {
          meetingSummary: {
            updatedAt: 'desc',
          },
        },
        {
          updatedAt: 'desc',
        },
        {
          id: 'desc',
        },
      ],
    });
  }
}
