package com.saas.voip.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.Map;

@Service
@Slf4j
@RequiredArgsConstructor
public class TwilioApiClient {

    private final RestTemplate restTemplate = new RestTemplate();

    @Value("${twilio.account.sid:}")
    private String accountSid;

    @Value("${twilio.auth.token:}")
    private String authToken;

    private static final String TWILIO_API_BASE = "https://api.twilio.com/2010-04-01";

    public List<Map<String, Object>> listIncomingPhoneNumbers() {
        if (accountSid == null || accountSid.isEmpty() || authToken == null || authToken.isEmpty()) {
            log.warn("⚠️ Twilio credentials not configured");
            return List.of();
        }

        try {
            log.info("📋 Fetching Twilio incoming phone numbers");

            String url = TWILIO_API_BASE + "/Accounts/" + accountSid + "/IncomingPhoneNumbers.json";

            HttpHeaders headers = createAuthHeaders();
            HttpEntity<?> request = new HttpEntity<>(headers);

            ResponseEntity<Map> response = restTemplate.exchange(
                    url,
                    HttpMethod.GET,
                    request,
                    Map.class);

            if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
                // Twilio returns { "incoming_phone_numbers": [ ... ] }
                Object numbersObj = response.getBody().get("incoming_phone_numbers");
                if (numbersObj instanceof List) {
                    return (List<Map<String, Object>>) numbersObj;
                }
            }

        } catch (Exception e) {
            log.error("❌ Failed to list Twilio numbers: {}", e.getMessage());
        }

        return new ArrayList<>();
    }

    private HttpHeaders createAuthHeaders() {
        HttpHeaders headers = new HttpHeaders();
        String auth = accountSid + ":" + authToken;
        byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes());
        String authHeader = "Basic " + new String(encodedAuth);
        headers.set("Authorization", authHeader);
        return headers;
    }
}
