
    iu                     t    d Z ddlZddlZddlZddlZdZdZddiZddd	d
dddZ	h dZ
d Z G d d          ZdS )u~   
[CYBER-STRAT] Agent Geo-Intelligence — Resolution geospatiale des entites
urllib.request uniquement (zero import requests)
    Nz*https://nominatim.openstreetmap.org/searchg?z
User-Agentz?CyberStrat/1.0 (console-intelligence-geopolitique; educational)                  )countrypersonorganizationconceptcityregion>   r   r   r	   c                 0    t          d|  d|            d S )Nz[CYBER-STRAT][GEO][z] )print)levelmessages     2/var/www/cyber-strat/agents_python/geo_resolver.py_logr   "   s'    	
2
2
2
2
233333    c                   &    e Zd ZdZddZd Zd ZdS )GeoResolverz@Resolution geospatiale des entites via Nominatim (OpenStreetMap)r   c                    t          j        t                     |dddd}|dk    r
d|d<   d|d<   t          j                            |          }t           d	| }	 t          j                            |t          
          }t          j        
                    |d          5 }t          j        |                                                    d                    }ddd           n# 1 swxY w Y   |st          dd| d           dS |dk    r|                     ||          }	n|d         }	|t"          v rdnd}
t%          |	d                   t%          |	d                   |	                    d|                              d          d                                         |	                    d|          t,                              |d          |
|	                    d          d}t          dd| d|d          d|d          d |
 d!	           |S # t.          $ r!}t          d"d#| d$|            Y d}~dS d}~ww xY w)%zResout une entite en coordonnees GPS via Nominatim.
        Retourne un dict avec lat, lon, label, zoom, display_mode ou None.
        json3fr)qformatlimitzaccept-languager	   featuretype5r   ?)headers
   )timeoutzutf-8NWARNzAucun resultat geo pour ''r   mapcoordslatlondisplay_name,r   boundingbox)r)   r*   label
full_labelzoomdisplay_modebboxINFOzGeo resolu: 'z' -> z, z ()ERRORzErreur resolution geo 'z': )timesleepNOMINATIM_DELAYurllibparse	urlencodeNOMINATIM_APIrequestRequestHEADERSurlopenr   loadsreaddecoder   _select_best_countryMAP_ENTITY_TYPESfloatgetsplitstripZOOM_LEVELS	Exception)selfqueryentity_typeparams_dictparamsurlreqrespresultsbestr1   geo_dataes                r   resolvezGeoResolver.resolve)   s    	
?### #	
 
 )##)2K&#&K ''44))))	.((g(>>C''R'88 BD*TYY[[%7%7%@%@AAB B B B B B B B B B B B B B B  VAAAABBBt i''00%@@qz$/3C$C$C55L T%[))T%[)).%88>>sCCAFLLNN"hh~u==#Q77 ,// H jjjXe_jjQVjj[gjjjkkkO 	 	 	AEAAaAABBB44444	sD   AH $:C*H *C..H 1C.2H DH 
I#H??Ic                    d |D             }|r_t          |d           }t          ddt          |           dt          |           d| d|                    d	d
           d	           |S t          dd| d           |d         S )au  Selectionne le meilleur resultat pays parmi les candidats Nominatim.

        Prefere les resultats avec osm_type='relation', class='boundary',
        type='administrative' (signature d'un vrai pays dans OSM).
        En cas de multiples candidats, prend celui avec l'importance la plus haute.
        Fallback sur results[0] si aucun candidat ne passe le filtre.
        c                     g | ]O}|                     d           dk    r4|                     d          dk    r|                     d          dk    M|PS )osm_typerelationclassboundarytypeadministrativerG   ).0rs     r   
<listcomp>z4GeoResolver._select_best_country.<locals>.<listcomp>g   sf     
 
 
uuZ  J..g*,,f!111  211r   c                 H    t          |                     dd                    S )N
importancer   )rF   rG   )rc   s    r   <lambda>z2GeoResolver._select_best_country.<locals>.<lambda>o   s    quu\ST?U?U9V9V r   )keyr3   zFiltre pays: z candidat(s) sur z resultats pour 'u   ' — selection: 'r+   r!   r&   r%   z-Aucun candidat boundary/administrative pour 'z ', fallback sur premier resultatr   )maxr   lenrG   )rL   rT   rM   country_candidatesrU   s        r   rD   z GeoResolver._select_best_country_   s    
 

 
 
  	)/V/VWWWD I-?)@)@ I ILLI I;@I I(,(E(EI I I J J J KV 7U 7 7 7 	8 	8 	8qzr   c           	          |sdS |d         |d         g|                     dd          |d         |d         ||                     d|          dgdd	d
ddS )z4Construit la configuration Leaflet pour le front-endNr)   r*   r0   r   r.   )r)   r*   r.   popupz=https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.pngzCartoDB Dark Matterabcd)rQ   attribution
subdomains)centerr0   markers
tile_layerra   )rL   rV   entity_names      r   build_leaflet_configz GeoResolver.build_leaflet_configy   s     	4  8LL++ $E?#E?(%\\';??	  W4$ 
 
 	
r   N)r   )__name__
__module____qualname____doc__rX   rD   ru    r   r   r   r   &   sM        JJ4 4 4 4l  4
 
 
 
 
r   r   )ry   r   urllib.requestr9   urllib.parser6   r<   r8   r?   rJ   rE   r   r   rz   r   r   <module>r}      s    
          < S   100 4 4 4h
 h
 h
 h
 h
 h
 h
 h
 h
 h
r   