import { Injectable } from "@nestjs/common"
import { InjectRepository } from "@nestjs/typeorm"
import { In, Repository } from "typeorm"
import { BaseAbstractRepository } from "../../../common/repository/base.repository"
import { UserLogin } from "../entities/user-login.entity"

@Injectable()
export class UserLoginRepository extends BaseAbstractRepository<UserLogin> {
  constructor(
    @InjectRepository(UserLogin)
    private readonly userLoginRepository: Repository<UserLogin>,
  ) {
    super(userLoginRepository)
  }

  async findByRefreshToken(refreshToken: string): Promise<UserLogin | null> {
    const userLogin = await this.userLoginRepository.findOne({
      where: { refresh_token: refreshToken },
      relations: ["user"],
      withDeleted: true,
    })
    return userLogin
  }

  async updateTokens(
    id: number,
    accessToken: string,
    refreshToken: string,
    accessTokenExpiry: string,
    refreshTokenExpiry: Date,
  ): Promise<void> {
    await this.userLoginRepository.update(id, {
      access_token: accessToken,
      access_token_expire_at: accessTokenExpiry,
      refresh_token: refreshToken,
      refresh_token_expire_at: refreshTokenExpiry,
      deleted_at: null,
    })
  }

  async revokeRefreshToken(refreshToken: string): Promise<void> {
    await this.userLoginRepository.update(
      { refresh_token: refreshToken },
      { refresh_token: null, refresh_token_expire_at: null },
    )
  }

  async removeFcmTokens(fcmTokens: string[]): Promise<void> {
    await this.userLoginRepository.update(
      { fcm_token: In(fcmTokens) },
      { fcm_token: null },
    )
  }

  async removeMobileSessionsByUserId(userId: number): Promise<void> {
    await this.userLoginRepository.softDelete({
      user_id: userId,
      device_type: In(["android", "ios"]),
    })
  }
}
