import { ExtractJwt, Strategy } from 'passport-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { InjectRepository } from '@nestjs/typeorm';
import { 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";
import { Request } from 'express';

@Injectable()
export class QueryCommonStrategy extends PassportStrategy(Strategy, 'query-common') {
  constructor(
    @InjectRepository(Users)
    private Users: Repository<Users>,
  ) {
    super({
      jwtFromRequest: ExtractJwt.fromExtractors([
        (req: Request) => {
          return req.query.access_token as string || null; // Extract token from query params
        }
      ]),
      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}});

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

    if (existsUser.is_active == false) {
      throw new HttpException(responseMessages.en.strategy.user_not_active, HttpStatus.UNAUTHORIZED);
    }
    return existsUser;
  }
}