import phonenumbers
from phonenumbers import geocoder

class ZoneDetector:
    def detect_region(self, phone_str: str, default_region="General"):
        """
        Intenta detectar la región basada en el número telefónico (Fijos).
        Para celulares, retorna default_region a menos que se implemente
        lógica adicional con base de datos externa.
        """
        try:
            # Parsear número (asumiendo CO si no tiene +57)
            if not phone_str.startswith('+'):
                phone_str = "+57" + phone_str
            
            parsed_num = phonenumbers.parse(phone_str, "CO")
            
            if not phonenumbers.is_valid_number(parsed_num):
                 return default_region

            # Obtener ubicación geográfica (solo funciona bien para fijos)
            location_desc = geocoder.description_for_number(parsed_num, "es")
            location_lower = location_desc.lower()
            
            # Mapeo exhaustivo de departamentos por región
            regions_map = {
                "Caribe": [
                    'atlántico', 'bolívar', 'magdalena', 'cesar', 'córdoba', 'sucre', 'la guajira', 
                    'san andrés', 'providencia', 'barranquilla', 'cartagena', 'santa marta', 'sincelejo', 
                    'montería', 'valledupar', 'riohacha'
                ],
                "Andina": [
                    'bogotá', 'cundinamarca', 'boyacá', 'antioquia', 'medellín', 'tolima', 'huila', 
                    'caldas', 'risaralda', 'quindío', 'santander', 'norte de santander', 'bucaramanga', 
                    'cúcuta', 'manizales', 'pereira', 'armenia', 'neiva', 'ibagué', 'tunja', 'barrancabermeja'
                ],
                "Pacifica": [
                    'valle del cauca', 'cali', 'cauca', 'popayán', 'nariño', 'pasto', 'chocó', 'quibdó'
                ],
                "Orinoquia": [
                    'meta', 'villavicencio', 'arauca', 'casanare', 'yopal', 'vichada', 'puerto carreño'
                ],
                "Amazonia": [
                    'amazonas', 'leticia', 'caquetá', 'florencia', 'guainía', 'inírida', 'guaviare', 
                    'san josé del guaviare', 'putumayo', 'mocoa', 'vaupés', 'mitú'
                ]
            }
            
            for region_name, keywords in regions_map.items():
                if any(k in location_lower for k in keywords):
                    return region_name
                
            return default_region
            
        except Exception as e:
            # En caso de error de parseo, asumimos general
            return default_region
