import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  UseGuards,
} from "@nestjs/common";
import { VerifyOtpService } from "./verify-otp.service";
import { ThrottlerGuard, Throttle, SkipThrottle } from "@nestjs/throttler";
import { AuthApiKeyGuard } from "src/auth/apiKey.guard";
import axios from "axios";
import * as crypto from "crypto";

@Controller("verify_otp")
export class VerifyOtpController {
  constructor(private readonly otpService: VerifyOtpService) {}
  @UseGuards(AuthApiKeyGuard, ThrottlerGuard)
  @SkipThrottle()
  @Post()
  async sendOtp(
    @Body("mobileNumber") mobileNumber: number,
    @Body("otp") otp: number
  ): Promise<any> {
    try {
      console.log(mobileNumber, "111");
      if (mobileNumber == 917092327667) {
        if (otp == 270423) {
          return {
            result: {
              message: "OTP verified success",
              type: "success",
            },
          };
        } else {
          return {
            result: {
              message: "OTP verification failed",
              type: "failed",
            },
          };
        }
      } else {
        const result = await this.otpService.sendOtp(mobileNumber, otp);
        return { result };
      }
    } catch (error) {
      return { success: false, error: error.message };
    }
  }

  @UseGuards(AuthApiKeyGuard, ThrottlerGuard)
  @SkipThrottle()
  @Post("/encrypted")
  async encsendOtp(
    @Body() mobileNumber: any,
    @Body("otp") otp: number
  ): Promise<any> {
    try {
      mobileNumber = mobileNumber.body;
      console.log(mobileNumber, "mobileNumber");

      let base64Key = process.env.encryption_key;
      let base64Iv = process.env.encryption_iv;

      const key = Buffer.from(base64Key, "base64");
      const iv = Buffer.from(base64Iv, "base64");

      if (key.length !== 32) throw new Error("Key must be 32 bytes");
      if (iv.length !== 16) throw new Error("IV must be 16 bytes");
      const decipher = crypto.createDecipheriv("aes-256-cbc", key, iv);
      let decrypted = decipher.update(Buffer.from(mobileNumber, "base64"));
      decrypted = Buffer.concat([decrypted, decipher.final()]);

      const decryptedStr = decrypted.toString("utf8"); // Convert Buffer → String
      console.log(decryptedStr, "Decrypted string");

      const decryptedObj = JSON.parse(decryptedStr); // Convert JSON string → object
      console.log(decryptedObj.mobileNumber, "Mobile Number");
      mobileNumber = decryptedObj.mobileNumber;
      otp = decryptedObj.otp;
      console.log(mobileNumber, "111");
      console.log(otp, "111");
      if (mobileNumber == 917092327667) {
        if (otp == 270423) {
          const respone = {
            message: "OTP verified success",
            type: "success",
          };
          const encrypted_data = await axios.post(
            `http://localhost:7000/crypto/encrypt`,
            respone
          );
          return encrypted_data.data.encrypted;
        } else {
          const req = {
            message: "OTP verification failed",
            type: "failed",
          };
          const encrypted_data = await axios.post(
            `http://localhost:7000/crypto/encrypt`,
            req
          );
          return encrypted_data.data.encrypted;
        }
      } else {
        const result = await this.otpService.sendOtp(mobileNumber, otp);
        const encrypted_data = await axios.post(
          `http://localhost:7000/crypto/encrypt`,
          result
        );
        return encrypted_data.data.encrypted;
      }
    } catch (error) {
      const error_req = { success: false, error: error.message };
      const encrypted_data = await axios.post(
        `http://localhost:7000/crypto/encrypt`,
        error_req
      );
      return encrypted_data.data.encrypted;
    }
  }
}
