import { and, eq, isNull, sql } from 'drizzle-orm';
import type { DrizzleClient } from '@/server/db/client.js';
import { sessions, users } from '@/server/db/schema.js';

export async function rotateRefreshToken(
  db: DrizzleClient,
  oldHash: string,
  newHash: string,
  previousRefreshedAt: Date,
  expiresAt: Date,
): Promise<{ id: string }[]> {
  return db
    .update(sessions)
    .set({
      refreshTokenHash: newHash,
      previousRefreshTokenHash: oldHash,
      lastRefreshedAt: previousRefreshedAt,
      expiresAt,
    })
    .where(eq(sessions.refreshTokenHash, oldHash))
    .returning({ id: sessions.id });
}

export async function incrementMhVersion(db: DrizzleClient, userId: string) {
  return db
    .update(users)
    .set({ mhVersion: sql`${users.mhVersion} + 1` })
    .where(eq(users.id, userId))
    .returning({ mhVersion: users.mhVersion });
}

export async function incrementSessionVersion(db: DrizzleClient, userId: string) {
  return db
    .update(users)
    .set({ sessionVersion: sql`${users.sessionVersion} + 1` })
    .where(eq(users.id, userId))
    .returning({ sessionVersion: users.sessionVersion });
}

export async function revokeActiveSessions(db: DrizzleClient, userId: string, revokedAt: Date) {
  return db
    .update(sessions)
    .set({ revokedAt })
    .where(and(eq(sessions.userId, userId), isNull(sessions.revokedAt)));
}
