import type { PrismaClient } from '@prisma/client'
import type {
  IRefreshTokenRepository,
  CreateRefreshTokenData,
  ValidRefreshToken,
} from '../../domain/ports/refresh-token-repository'

export class PrismaRefreshTokenRepository implements IRefreshTokenRepository {
  constructor(private readonly db: PrismaClient) {}

  async create(data: CreateRefreshTokenData): Promise<void> {
    await this.db.refreshToken.create({
      data: {
        userId: data.userId,
        tokenHash: data.tokenHash,
        expiresAt: data.expiresAt,
      },
    })
  }

  async findValidByHash(tokenHash: string): Promise<ValidRefreshToken | null> {
    const record = await this.db.refreshToken.findFirst({
      where: {
        tokenHash,
        revokedAt: null,
        expiresAt: { gt: new Date() },
      },
      select: { id: true, userId: true },
    })
    return record
  }

  async revoke(id: string): Promise<void> {
    await this.db.refreshToken.update({
      where: { id },
      data: { revokedAt: new Date() },
    })
  }

  async revokeAllForUser(userId: string): Promise<void> {
    await this.db.refreshToken.updateMany({
      where: { userId, revokedAt: null },
      data: { revokedAt: new Date() },
    })
  }

  async deleteExpired(): Promise<void> {
    await this.db.refreshToken.deleteMany({
      where: { expiresAt: { lt: new Date() } },
    })
  }
}
