import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, FindOptionsWhere } from 'typeorm';
import { ClsService } from 'nestjs-cls';
import { TenantAwareRepository } from '../../../common/repositories/tenant-aware.repository';
import { UserEntity } from '../../../entities/user.entity';

@Injectable()
export class UserRepository extends TenantAwareRepository<UserEntity> {
  constructor(
    @InjectRepository(UserEntity) repo: Repository<UserEntity>,
    cls: ClsService,
  ) {
    super(repo, cls);
  }

  async findByEmail(email: string): Promise<UserEntity | null> {
    return this.findOne({
      where: { email } as FindOptionsWhere<UserEntity>,
      relations: ['role'],
    });
  }

  async findAllWithRole(): Promise<UserEntity[]> {
    return this.find({
      relations: ['role'],
      order: { created_at: 'DESC' } as any,
    });
  }

  async findByIdWithRole(id: string): Promise<UserEntity | null> {
    return this.findOne({
      where: { id } as FindOptionsWhere<UserEntity>,
      relations: ['role', 'role.permissions'],
    });
  }
}
