package com.emonster.taroaichat.service;

import com.emonster.taroaichat.config.ApplicationProperties;
import com.twilio.exception.ApiException;
import com.twilio.rest.verify.v2.service.Verification;
import com.twilio.rest.verify.v2.service.VerificationCheck;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;

/**
 * Service for handling Twilio Verify API operations
 */
@Service
@ConditionalOnProperty(prefix = "application.twilio", name = "enabled", havingValue = "true")
public class TwilioService {

    private static final Logger log = LoggerFactory.getLogger(TwilioService.class);

    private final ApplicationProperties applicationProperties;

    public TwilioService(ApplicationProperties applicationProperties) {
        this.applicationProperties = applicationProperties;
    }

    /**
     * Send verification code to phone number
     * @param phoneNumber The phone number to verify (E.164 format)
     * @return true if verification was sent successfully
     */
    public boolean sendVerificationCode(String phoneNumber) {
        try {
            String serviceSid = applicationProperties.getTwilio().getVerifyServiceSid();

            if (serviceSid == null || serviceSid.isEmpty()) {
                log.error("Twilio Verify Service SID is not configured");
                return false;
            }

            Verification verification = Verification.creator(
                    serviceSid,
                    phoneNumber,
                    "sms"
                )
                .create();

            log.info("Verification sent to {}, status: {}", phoneNumber, verification.getStatus());
            return "pending".equals(verification.getStatus());
        } catch (ApiException e) {
            log.error("Failed to send verification code to {}: {}", phoneNumber, e.getMessage());
            return false;
        } catch (Exception e) {
            log.error("Unexpected error sending verification code", e);
            return false;
        }
    }

    /**
     * Check verification code
     * @param phoneNumber The phone number to verify (E.164 format)
     * @param code The verification code
     * @return true if verification code is valid
     */
    public boolean checkVerificationCode(String phoneNumber, String code) {
        try {
            String serviceSid = applicationProperties.getTwilio().getVerifyServiceSid();

            if (serviceSid == null || serviceSid.isEmpty()) {
                log.error("Twilio Verify Service SID is not configured");
                return false;
            }

            VerificationCheck verificationCheck = VerificationCheck.creator(serviceSid)
                .setTo(phoneNumber)
                .setCode(code)
                .create();

            log.info("Verification check for {}, status: {}", phoneNumber, verificationCheck.getStatus());
            return "approved".equals(verificationCheck.getStatus());
        } catch (ApiException e) {
            log.error("Failed to verify code for {}: {}", phoneNumber, e.getMessage());
            return false;
        } catch (Exception e) {
            log.error("Unexpected error checking verification code", e);
            return false;
        }
    }

    /**
     * Format phone number to E.164 format if needed
     * @param phoneNumber The phone number to format
     * @return Formatted phone number
     */
    public String formatPhoneNumber(String phoneNumber) {
        // If already starts with +, assume it's in E.164 format
        if (phoneNumber.startsWith("+")) {
            return phoneNumber;
        }

        // For simplicity, assume US numbers if no country code
        // In production, you might want to use libphonenumber library
        if (phoneNumber.length() == 10) {
            return "+1" + phoneNumber;
        }

        return phoneNumber;
    }
}
