import { OAuthClientStatus, OAuthClientType } from "@calcom/prisma/enums";
import { TestingModule } from "@nestjs/testing";
import { PrismaReadService } from "@/modules/prisma/prisma-read.service";
import { PrismaWriteService } from "@/modules/prisma/prisma-write.service";

export class OAuth2ClientRepositoryFixture {
  private prismaReadClient: PrismaReadService["prisma"];
  private prismaWriteClient: PrismaWriteService["prisma"];

  constructor(module: TestingModule) {
    this.prismaReadClient = module.get(PrismaReadService).prisma;
    this.prismaWriteClient = module.get(PrismaWriteService).prisma;
  }

  async create(data: {
    clientId: string;
    name: string;
    redirectUri: string;
    clientSecret?: string;
    clientType?: OAuthClientType;
    status?: OAuthClientStatus;
    logo?: string;
    isTrusted?: boolean;
    userId?: number;
  }) {
    return this.prismaWriteClient.oAuthClient.create({
      data: {
        clientId: data.clientId,
        name: data.name,
        redirectUri: data.redirectUri,
        clientSecret: data.clientSecret,
        clientType: data.clientType || OAuthClientType.CONFIDENTIAL,
        status: data.status || OAuthClientStatus.APPROVED,
        logo: data.logo,
        isTrusted: data.isTrusted || false,
        ...(data.userId && { user: { connect: { id: data.userId } } }),
      },
    });
  }

  async updateStatus(clientId: string, status: OAuthClientStatus) {
    return this.prismaWriteClient.oAuthClient.update({
      where: { clientId },
      data: { status },
    });
  }

  async delete(clientId: string) {
    return this.prismaWriteClient.oAuthClient.delete({
      where: { clientId },
    });
  }
}
