import {
  Injectable,
  UnauthorizedException,
  Logger,
  // HttpException,
} from '@nestjs/common';
import { UserRepository } from './user.repository';
import { InjectRepository } from '@nestjs/typeorm';
import { AuthCredentialsDto } from './dto/auth-credentials.dto';
import { JwtService } from '@nestjs/jwt';
import { JwtPayload } from '../interfaces/jwt-payload.interface';
import { SmsService } from '@/common/providers/sms.service';
import { RedisClientService } from '@/common/providers/redis-client.service';
import { HttpResponse } from '@/common/interfaces/http-response.interface';
import { CodeExpireException } from '@/common/exceptions/code-expire.exception';
import { LoginByPwdDto } from './dto/login-by-pwd.dto';

@Injectable()
export class AuthService {
  private logger = new Logger('AuthService');
  constructor(
    @InjectRepository(UserRepository)
    private userRepository: UserRepository,
    private jwtService: JwtService,
    private smsService: SmsService,
    private redisClientService: RedisClientService,
  ) {}

  async register(authCredentialsDto: AuthCredentialsDto): Promise<void> {
    const { phone, code } = authCredentialsDto;
    if (process.env.NODE_ENV === 'development' && code === '666666') {
      return this.userRepository.register(authCredentialsDto);
    }
    const result = await this.redisClientService.getValue(phone);
    if (!result || result != code) {
      throw new CodeExpireException();
    } else {
      // 否则使用过后,删除该key
      await this.redisClientService.delKey(phone);
    }
    return this.userRepository.register(authCredentialsDto);
  }

  async loginByPwd(
    loginData: LoginByPwdDto,
  ): Promise<{ accessToken: string; user: unknown }> {
    const user = await this.userRepository.validateuserPassword(loginData);

    if (!user) {
      throw new UnauthorizedException('Invalid credentials');
    }

    const { userId } = user;
    const payload: JwtPayload = { userId };
    const accessToken: string = await this.jwtService.sign(payload);

    this.logger.debug(
      `Generator JWT token with payload ${JSON.stringify(payload)}`,
    );
    return { accessToken, user };
  }

  // 发送短信
  async sendCode(phone: string): Promise<HttpResponse> {
    const code = String(Math.random()).slice(-6);
    console.log('---> 验证码: ', code);
    await this.redisClientService.setValue(phone, code, 'EX', 60 * 10);
    const result = await this.smsService.sendCode(phone, code);
    // const result = 1;
    return {
      statusCode: result ? 0 : 1,
    };
  }
}