import { Controller, Body, Get, Post } from "@nestjs/common";
import { ResendOtpService } from "./resend-otp.service";
import * as crypto from "crypto";
import axios from "axios";

@Controller("resend_otp")
export class ResendOtpController {
  constructor(private readonly otpService: ResendOtpService) {}

  @Post()
  async sendOtp(
    @Body("mobileNumber") mobileNumber: string,
    @Body("type") type: string
  ): Promise<any> {
    try {
      console.log(mobileNumber, "111");

      const result = await this.otpService.sendOtp(mobileNumber, type);
      return { success: true, result };
    } catch (error) {
      return { success: false, error: error.message };
    }
  }

  @Post("/encrypted")
  async encsendOtp(
    @Body() mobileNumber: any,
    @Body("type") type: string
  ): 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;
      type = decryptedObj.type;
      console.log(mobileNumber, "111");

      const result = await this.otpService.sendOtp(mobileNumber, type);
      // const succ_req = {
      //   success: true,
      //   result,
      // };
      let succ_req;
      if (result.status_code !== 200) {
        succ_req = { success: false, result };
      } else {
        succ_req = { success: true, result };
      }
      const encrypted_data = await axios.post(
        `http://localhost:7000/crypto/encrypt`,
        succ_req
      );
      return encrypted_data.data.encrypted;
    } catch (error) {
      const err_req = { success: false, error: error.message };
      const encrypted_data = await axios.post(
        `http://localhost:7000/crypto/encrypt`,
        err_req
      );
      return encrypted_data.data.encrypted;
    }
  }
}
