package com.saas.shared.service;

import com.saas.admin.entity.PhoneNumber;
import com.saas.admin.repository.PhoneNumberRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.Optional;

/**
 * PhoneNumberBoundaryService
 * 
 * Boundary service that provides controlled access to phone number data
 * from the admin database for VoIP controllers and services.
 * 
 * This service acts as an abstraction layer between the VoIP layer
 * and the admin data layer, maintaining clean architecture boundaries.
 * 
 * Usage:
 * - VoIP controllers should use this service instead of directly injecting PhoneNumberRepository
 * - Ensures consistent tenant resolution across all VoIP providers
 * - Centralizes phone number lookup logic
 */
@Service
@Slf4j
@RequiredArgsConstructor
public class PhoneNumberBoundaryService {

    private final PhoneNumberRepository phoneNumberRepository;

    /**
     * Resolve tenant ID from a phone number
     * 
     * @param phoneNumber Phone number (E.164 format recommended)
     * @return Tenant ID if found, null otherwise
     */
    public String resolveTenantIdFromPhoneNumber(String phoneNumber) {
        if (phoneNumber == null || phoneNumber.isEmpty()) {
            log.warn("⚠️ [PhoneNumberBoundary] No phone number provided for tenant resolution");
            return null;
        }
        
        try {
            Optional<PhoneNumber> phoneOpt = phoneNumberRepository.findByPhoneNumber(phoneNumber);
            if (phoneOpt.isPresent()) {
                String tenantId = phoneOpt.get().getTenantId();
                log.debug("✅ [PhoneNumberBoundary] Tenant resolved for phone {}: {}", phoneNumber, tenantId);
                return tenantId;
            } else {
                log.warn("⚠️ [PhoneNumberBoundary] Phone number {} not found in database", phoneNumber);
            }
        } catch (Exception e) {
            log.error("❌ [PhoneNumberBoundary] Error resolving tenant for phone {}: {}", phoneNumber, e.getMessage());
        }
        
        return null;
    }

    /**
     * Find phone number entity by phone number string
     * 
     * @param phoneNumber Phone number to search for
     * @return Optional PhoneNumber entity
     */
    public Optional<PhoneNumber> findByPhoneNumber(String phoneNumber) {
        if (phoneNumber == null || phoneNumber.isEmpty()) {
            log.warn("⚠️ [PhoneNumberBoundary] Empty phone number provided");
            return Optional.empty();
        }
        
        try {
            return phoneNumberRepository.findByPhoneNumber(phoneNumber);
        } catch (Exception e) {
            log.error("❌ [PhoneNumberBoundary] Error finding phone number {}: {}", phoneNumber, e.getMessage());
            return Optional.empty();
        }
    }

    /**
     * Check if a phone number exists in the database
     * 
     * @param phoneNumber Phone number to check
     * @return true if exists, false otherwise
     */
    public boolean phoneNumberExists(String phoneNumber) {
        return findByPhoneNumber(phoneNumber).isPresent();
    }
}
