import { HttpException, HttpStatus, Injectable } from "@nestjs/common";
import { InjectModel } from "@nestjs/sequelize";
import { Admin } from "./entities/admin.entity";
import * as bcrypt from "bcrypt";
import { JwtService } from "@nestjs/jwt";
import { ConfigService } from "@nestjs/config";
@Injectable()
export class AdminService {
  constructor(
    @InjectModel(Admin) private readonly adminModel: typeof Admin,
    private readonly jwtService: JwtService,
    private readonly configService: ConfigService,
  ) {}
  async register(email: string, password: string): Promise<Admin> {
    try {
      if (!email) {
        throw new HttpException("Email should be entered.", HttpStatus.BAD_REQUEST);
      }

      if (!password) {
        throw new HttpException("Password should be entered.", HttpStatus.BAD_REQUEST);
      }

      const existingAdmin = await this.adminModel.findOne({ where: { email } });
      if (existingAdmin) {
        throw new HttpException("Email is already registered.", HttpStatus.CONFLICT);
      }

      const hashedPassword = await bcrypt.hash(password, 10);

      const admin = await this.adminModel.create({
        email,
        password: hashedPassword,
        role: "admin",
      });

      return admin;
    } catch (error) {
      if (error instanceof HttpException) {
        throw error;
      }
      throw new HttpException("An error occurred during registration.", HttpStatus.INTERNAL_SERVER_ERROR);
    }
  }

  async login(email: string, password: string): Promise<{ token: string }> {
    try {
      const admin = await this.adminModel.findOne({ where: { email } });
      if (!admin) {
        throw new HttpException("Invalid email or password", HttpStatus.UNAUTHORIZED);
      }
      const isValidPassword = await bcrypt.compare(password, admin.password);
      if (!isValidPassword) {
        throw new HttpException("Invalid email or password", HttpStatus.UNAUTHORIZED);
      }
      const token = this.jwtService.sign(
        { id: admin.id, role: admin.role },
        {
          secret: this.configService.get<string>("JWT_SECRET"),
          expiresIn: this.configService.get<string | number>("JWT_EXPIRES") || "1h",
        },
      );
      return { token };
    } catch (error) {
      console.log(error);
      throw new HttpException("An error occurred during login.", HttpStatus.INTERNAL_SERVER_ERROR);
    }
  }
}