import { Injectable } from '@nestjs/common';
import {
  AuthenticationRegistry,
  SessionCookieProvider,
} from '@nestjs/authentication';
import type { SessionRecord } from '@nestjs/authentication';
import { PrismaService } from '../../database/prisma.service.js';
import type { AppUser } from './auth.types.js';

/** Loads admins and customers alike; AdminGuard restricts the admin routes. */
@Injectable()
export class AdminSessionProvider extends SessionCookieProvider<AppUser> {
  constructor(
    private readonly prisma: PrismaService,
    registry: AuthenticationRegistry,
  ) {
    super();
    registry.registerProvider(this);
  }

  protected async validate(session: SessionRecord): Promise<AppUser | null> {
    if (!/^\d+$/.test(session.userId)) {
      return null;
    }
    const user = await this.prisma.user.findUnique({
      where: { id: Number(session.userId) },
      select: {
        id: true,
        email: true,
        firstName: true,
        lastName: true,
        phone: true,
        role: true,
      },
    });
    return user ? toAppUser(user) : null;
  }
}

export function toAppUser(user: {
  id: number;
  email: string;
  firstName: string | null;
  lastName: string | null;
  phone: string | null;
  role: 'ADMIN' | 'CUSTOMER';
}): AppUser {
  return {
    id: String(user.id),
    email: user.email,
    firstName: user.firstName,
    lastName: user.lastName,
    phone: user.phone,
    role: user.role,
  };
}
