import { ExtractJwt, Strategy } from 'passport-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { InjectRepository } from '@nestjs/typeorm';
import { In, Repository } from 'typeorm';
import { Injectable, HttpException, HttpStatus } from '@nestjs/common';
import { Constants } from '../../../common/constants';
import { responseMessages } from '../../../messages/response-messages';
import { Users, UserRoles } from "../../../entities/users.entity";


@Injectable()
export class AdminBrandStrategy extends PassportStrategy(Strategy, 'admin-brand') {
  constructor(
    @InjectRepository(Users)
    private Users: Repository<Users>,
  ) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: Constants.jwt_secret,
    });
  }

  async validate(payload: any)
  {
    const userId = payload.sub;
    // const email = payload.username;//

    if (!userId) {
        throw new HttpException(responseMessages.en.strategy.access_token_invalid, HttpStatus.UNAUTHORIZED);
    }

    const existsUser = await this.Users.findOne({where:{
      id:userId,
      role: In([UserRoles.ADMIN,UserRoles.BRAND])
    }});

    if(!existsUser){
        throw new HttpException(responseMessages.en.strategy.user_not_valid, HttpStatus.UNAUTHORIZED);
    }

    return existsUser;
  }
}