import { Injectable, Logger } from "@nestjs/common"
import { SNSClient, PublishCommand } from "@aws-sdk/client-sns"

@Injectable()
export class SmsService {
  private readonly logger = new Logger(SmsService.name)

  /**
   * Sends a direct SMS message to a phone number.
   * @param phoneNumber The phone number to send SMS to (E.164 format)
   * @param message The SMS message
   * @returns Promise resolving with MessageId on success
   */
  async sendSms(phoneNumber: string, message: string): Promise<string> {
    try {
      if (!phoneNumber || !message) {
        throw new Error("Phone number and message are required")
      }

      if (
        !process.env.AWS_ACCESS_KEY_ID ||
        !process.env.AWS_SECRET_ACCESS_KEY
      ) {
        throw new Error("AWS credentials missing at runtime")
      }

      const snsClient: SNSClient = new SNSClient({
        region: process.env.AWS_REGION || "us-east-1",
        credentials: {
          accessKeyId: process.env.AWS_ACCESS_KEY_ID || "",
          secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY || "",
        },
      })

      const command = new PublishCommand({
        Message: message,
        PhoneNumber: phoneNumber,
      })

      const response = await snsClient.send(command)

      this.logger.log(
        `SMS sent to ${phoneNumber} | MessageId: ${response.MessageId}`,
      )
      return response.MessageId ?? ""
    } catch (error) {
      this.logger.error(`Failed to send SMS: ${error.message}`, error.stack)
      throw new Error(`Error sending SMS: ${error.message}`)
    }
  }
}
