import { Controller, Post, Body, UseGuards } from "@nestjs/common";
import { TwilioService } from "./twilio-otp.service";
import { SkipThrottle, Throttle, ThrottlerGuard } from "@nestjs/throttler";
import { AuthApiKeyGuard } from "src/auth/apiKey.guard";

@Controller("otp")
export class TwilioController {
  constructor(private readonly twilioService: TwilioService) {}
  @UseGuards(AuthApiKeyGuard, ThrottlerGuard)
  @SkipThrottle()

  // @Throttle(4, 600)
  @Post("send")
  async sendOtp(@Body("phone") phone: string) {
    if (phone == "+917092327667") {
      return {
        status_code: process.env.SUCCESS_STATUS_CODE,
        status: process.env.SUCCESS_STATUS,
        message: process.env.TWILIO_OTP_SEND_MESSAGE,
        phone: phone,
      };
    }

    try {
      let a = await this.twilioService.sendOtp(phone);

      if (a?.response?.data?.code) {
        return {
          status_code: process.env.ERROR_STATUS_CODE_PARAMS_MISSING,
          status: process.env.ERROR_STATUS,
          message: a?.response?.data?.message,
        };
      }
      return {
        status_code: process.env.SUCCESS_STATUS_CODE,
        status: process.env.SUCCESS_STATUS,
        message: process.env.TWILIO_OTP_SEND_MESSAGE,
        phone: phone,
      };
    } catch (error) {
      if (error?.response?.data?.code) {
        return {
          status_code: process.env.ERROR_STATUS_CODE_PARAMS_MISSING,
          status: process.env.ERROR_STATUS,
          message: error?.response?.data?.message,
        };
      }
      return {
        status_code: process.env.ERROR_STATUS_CODE,
        status: process.env.ERROR_STATUS,
        message: process.env.ERROR_MESSAGE,
      };
    }
  }

  @UseGuards(AuthApiKeyGuard)
  @Post("verify")
  async verifyOtp(@Body("phone") phone: string, @Body("code") code: string) {
    if (phone == "+917092327667") {
      if (phone == "+917092327667" && code == "270423") {
        return {
          status_code: process.env.SUCCESS_STATUS_CODE,
          status: process.env.SUCCESS_STATUS,
          message: process.env.TWILIO_OTP_VERIFY_MESSAGE,
        };
      } else {
        return {
          status_code: process.env.ERROR_STATUS_CODE_PARAMS_MISSING,
          status: process.env.ERROR_STATUS,
          message: process.env.TWILIO_OTP_INVALID_OTP,
        };
      }
    }
    try {
      let output = await this.twilioService.verifyOtp(phone, code);
      if (output.status == "pending" && output.valid === false) {
        return {
          status_code: process.env.ERROR_STATUS_CODE_PARAMS_MISSING,
          status: process.env.ERROR_STATUS,
          message: process.env.TWILIO_OTP_INVALID_OTP,
        };
      }
      return {
        status_code: process.env.SUCCESS_STATUS_CODE,
        status: process.env.SUCCESS_STATUS,
        message: process.env.TWILIO_OTP_VERIFY_MESSAGE,
      };
    } catch (error) {
      console.log(error.response.data, "error.response.data");

      if (error.response.data.code == 60200) {
        return {
          status_code: process.env.ERROR_STATUS_CODE_PARAMS_MISSING,
          status: process.env.ERROR_STATUS,
          message: process.env.TWILIO_OTP_INVALID_OTP,
        };
      }
      if (error.response.data.code == 20404) {
        return {
          status_code: process.env.ERROR_STATUS_CODE_PARAMS_MISSING,
          status: process.env.ERROR_STATUS,
          message: process.env.TWILIO_OTP_INVALID_PHONE,
        };
      }
      if (error.response.data.code == 60202) {
        return {
          status_code: process.env.ERROR_STATUS_CODE_PARAMS_MISSING,
          status: process.env.ERROR_STATUS,
          message: process.env.TWILIO_OTP_CHECK_MAX_ATTEMPT,
        };
      }
      return {
        status_code: process.env.ERROR_STATUS_CODE,
        status: process.env.ERROR_STATUS,
        message: process.env.ERROR_MESSAGE,
      };
    }
  }
}
