File size: 23,233 Bytes
9743f5c
 
 
729df82
9743f5c
729df82
 
 
 
9743f5c
729df82
9743f5c
729df82
 
 
 
 
 
 
 
 
9743f5c
 
729df82
 
 
9743f5c
729df82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9743f5c
 
729df82
 
 
 
9743f5c
729df82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9743f5c
729df82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9743f5c
729df82
 
 
 
 
 
 
 
 
 
 
 
9743f5c
729df82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9743f5c
729df82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9743f5c
729df82
 
 
 
 
9743f5c
729df82
 
 
 
 
 
 
 
 
 
 
 
 
9743f5c
729df82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9743f5c
729df82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9743f5c
729df82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9743f5c
729df82
 
 
9743f5c
729df82
 
 
9743f5c
729df82
 
 
9743f5c
729df82
 
9743f5c
729df82
 
9743f5c
729df82
9743f5c
 
729df82
9743f5c
729df82
 
9743f5c
729df82
9743f5c
729df82
 
 
 
 
 
9743f5c
729df82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9743f5c
729df82
 
 
 
 
9743f5c
729df82
 
 
 
 
9743f5c
729df82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9743f5c
729df82
 
9743f5c
729df82
 
9743f5c
729df82
 
 
 
9743f5c
729df82
9743f5c
729df82
9743f5c
729df82
 
 
 
 
 
9743f5c
 
729df82
9743f5c
729df82
9743f5c
 
729df82
 
9743f5c
 
 
 
 
729df82
 
 
9743f5c
 
729df82
9743f5c
729df82
9743f5c
729df82
 
 
 
 
9743f5c
729df82
 
 
 
 
9743f5c
729df82
9743f5c
 
729df82
9743f5c
 
729df82
9743f5c
 
 
729df82
 
 
 
9743f5c
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
import gradio as gr
import requests
import json
from datetime import datetime, timedelta
import re
import xml.etree.ElementTree as ET
from urllib.parse import quote
import time
import random

class RealTimeGeopoliticalAnalyzer:
    def __init__(self):
        # Fonti dati real-time pubbliche (senza API key)
        self.data_sources = {
            "reuters_rss": "https://feeds.reuters.com/reuters/worldNews",
            "bbc_rss": "https://feeds.bbci.co.uk/news/world/rss.xml",
            "un_news": "https://news.un.org/en/rss/rss.xml",
            "crisis_tracker": "https://api.gdeltproject.org/api/v2/summary/summary?d=web&t=summary&ts=full",
            "world_bank_data": "https://api.worldbank.org/v2/country/all/indicator/NY.GDP.MKTP.CD?format=json&date=2024",
            "open_sanctions": "https://data.opensanctions.org/datasets/latest/default/targets.simple.csv",
            "conflict_data": "https://ucdp.uu.se/downloads/ged/ged231-csv.zip"
        }
        
        # Cache per performance
        self.cache = {}
        self.cache_duration = 1800  # 30 minuti
        
        # AI Generativa - Template per analisi avanzata
        self.ai_templates = {
            "conflict_analysis": """
            Analizza questo conflitto geopolitico:
            - Attori: {actors}
            - Eventi recenti: {events}
            - Contesto: {context}
            
            Fornisci: cause profonde, dinamiche di potere, possibili escalation, soluzioni diplomatiche
            """,
            "economic_impact": """
            Valuta l'impatto economico di:
            - Situazione: {situation}
            - Paesi coinvolti: {countries}
            - Settori: {sectors}
            
            Analizza: effetti commerciali, catene di fornitura, mercati finanziari, conseguenze a lungo termine
            """,
            "alliance_dynamics": """
            Esamina le dinamiche delle alleanze:
            - Alleanze coinvolte: {alliances}
            - Tensioni: {tensions}
            - Interessi: {interests}
            
            Predici: cambiamenti negli equilibri, nuove partnership, fratture possibili
            """
        }
        
    def fetch_real_time_news(self):
        """Recupera notizie real-time da RSS feeds"""
        news_data = []
        
        try:
            # Reuters RSS
            response = requests.get(self.data_sources["reuters_rss"], timeout=10)
            if response.status_code == 200:
                root = ET.fromstring(response.content)
                for item in root.findall(".//item")[:5]:
                    title = item.find("title")
                    pub_date = item.find("pubDate")
                    description = item.find("description")
                    
                    if title is not None:
                        news_data.append({
                            "source": "Reuters",
                            "title": title.text,
                            "date": pub_date.text if pub_date is not None else "N/A",
                            "description": description.text if description is not None else ""
                        })
        except:
            pass
            
        try:
            # BBC RSS
            response = requests.get(self.data_sources["bbc_rss"], timeout=10)
            if response.status_code == 200:
                root = ET.fromstring(response.content)
                for item in root.findall(".//item")[:5]:
                    title = item.find("title")
                    pub_date = item.find("pubDate")
                    description = item.find("description")
                    
                    if title is not None:
                        news_data.append({
                            "source": "BBC",
                            "title": title.text,
                            "date": pub_date.text if pub_date is not None else "N/A",
                            "description": description.text if description is not None else ""
                        })
        except:
            pass
        
        return news_data[:10]  # Top 10 notizie
    
    def fetch_economic_indicators(self):
        """Recupera indicatori economici real-time"""
        try:
            # World Bank API (pubblico, no key)
            response = requests.get(self.data_sources["world_bank_data"], timeout=15)
            if response.status_code == 200:
                data = response.json()
                if len(data) > 1 and isinstance(data[1], list):
                    return data[1][:20]  # Top 20 economie
        except:
            pass
        return []
    
    def extract_geopolitical_entities(self, text_data):
        """Estrae entitร  geopolitiche da testi real-time con NLP"""
        entities = {
            "countries": set(),
            "organizations": set(),
            "conflicts": set(),
            "keywords": set()
        }
        
        # Pattern per paesi (piรน sofisticato)
        country_patterns = [
            r'\b(United States|USA|America|US)\b',
            r'\b(China|Chinese|Beijing)\b',
            r'\b(Russia|Russian|Moscow|Kremlin)\b',
            r'\b(Ukraine|Ukrainian|Kyiv|Kiev)\b',
            r'\b(Israel|Israeli|Jerusalem|Tel Aviv)\b',
            r'\b(Iran|Iranian|Tehran)\b',
            r'\b(Germany|German|Berlin)\b',
            r'\b(France|French|Paris)\b',
            r'\b(Italy|Italian|Rome)\b',
            r'\b(Japan|Japanese|Tokyo)\b',
            r'\b(India|Indian|New Delhi)\b',
            r'\b(Turkey|Turkish|Ankara)\b',
            r'\b(Saudi Arabia|Saudi|Riyadh)\b',
            r'\b(North Korea|DPRK|Pyongyang)\b',
            r'\b(South Korea|Seoul)\b',
            r'\b(Taiwan|Taipei)\b',
            r'\b(Pakistan|Islamabad)\b'
        ]
        
        # Pattern per organizzazioni
        org_patterns = [
            r'\b(NATO|North Atlantic)\b',
            r'\b(European Union|EU)\b',
            r'\b(United Nations|UN)\b',
            r'\b(BRICS)\b',
            r'\b(G7|G20)\b',
            r'\b(ASEAN)\b',
            r'\b(OPEC)\b',
            r'\b(IMF|World Bank)\b'
        ]
        
        # Keywords geopolitiche
        conflict_keywords = [
            r'\b(war|conflict|tension|crisis|sanctions|embargo|blockade)\b',
            r'\b(military|defense|security|nuclear|missile|drone)\b',
            r'\b(trade war|tariffs|economic pressure|diplomatic crisis)\b',
            r'\b(alliance|partnership|treaty|agreement|summit)\b'
        ]
        
        combined_text = ""
        if isinstance(text_data, list):
            for item in text_data:
                if isinstance(item, dict):
                    combined_text += f" {item.get('title', '')} {item.get('description', '')}"
                else:
                    combined_text += f" {str(item)}"
        else:
            combined_text = str(text_data)
        
        # Estrai entitร 
        for pattern in country_patterns:
            matches = re.findall(pattern, combined_text, re.IGNORECASE)
            entities["countries"].update([m if isinstance(m, str) else m[0] for m in matches])
        
        for pattern in org_patterns:
            matches = re.findall(pattern, combined_text, re.IGNORECASE)
            entities["organizations"].update([m if isinstance(m, str) else m[0] for m in matches])
            
        for pattern in conflict_keywords:
            matches = re.findall(pattern, combined_text, re.IGNORECASE)
            entities["keywords"].update([m if isinstance(m, str) else m[0] for m in matches])
        
        return entities
    
    def ai_generative_analysis(self, query, real_time_data, entities):
        """AI Generativa per analisi complessa"""
        
        # Determina il tipo di analisi necessaria
        query_lower = query.lower()
        analysis_type = "general"
        
        if any(word in query_lower for word in ["conflict", "war", "tension", "crisis"]):
            analysis_type = "conflict_analysis"
        elif any(word in query_lower for word in ["economic", "trade", "sanctions", "market"]):
            analysis_type = "economic_impact"
        elif any(word in query_lower for word in ["alliance", "nato", "partnership", "bloc"]):
            analysis_type = "alliance_dynamics"
        
        # Template AI per analisi generativa
        ai_analysis = {
            "situation_assessment": self.assess_current_situation(real_time_data, entities),
            "power_dynamics": self.analyze_power_dynamics(entities),
            "trend_analysis": self.identify_trends(real_time_data),
            "risk_assessment": self.calculate_risks(entities, real_time_data),
            "scenario_generation": self.generate_scenarios(query, entities),
            "strategic_implications": self.derive_strategic_implications(entities, real_time_data)
        }
        
        return ai_analysis
    
    def assess_current_situation(self, data, entities):
        """Valuta la situazione attuale basata su dati real-time"""
        assessment = []
        
        # Intensitร  delle tensioni basata su keywords
        tension_indicators = ["war", "conflict", "crisis", "sanctions", "military"]
        tension_count = sum(1 for keyword in entities.get("keywords", []) 
                          if keyword.lower() in tension_indicators)
        
        if tension_count >= 3:
            assessment.append("๐Ÿ”ด ALTA TENSIONE - Situazione critica rilevata")
        elif tension_count >= 1:
            assessment.append("๐ŸŸก TENSIONE MODERATA - Monitoraggio necessario")
        else:
            assessment.append("๐ŸŸข STABILITร€ RELATIVA - Situazione sotto controllo")
        
        # Coinvolgimento grandi potenze
        major_powers = ["United States", "USA", "China", "Russia", "European Union", "EU"]
        involved_powers = [p for p in major_powers if p in entities.get("countries", [])]
        
        if len(involved_powers) >= 2:
            assessment.append(f"โšก Coinvolte superpotenze: {', '.join(involved_powers)}")
        
        return assessment
    
    def analyze_power_dynamics(self, entities):
        """Analizza le dinamiche di potere"""
        dynamics = []
        
        countries = list(entities.get("countries", []))
        orgs = list(entities.get("organizations", []))
        
        # Analisi blocchi
        if "NATO" in orgs and any(country in ["Russia", "China"] for country in countries):
            dynamics.append("๐Ÿ”„ CONFRONTO EST-OVEST - Dinamiche da Guerra Fredda")
        
        if "China" in countries and "Taiwan" in countries:
            dynamics.append("โš”๏ธ TENSIONE TAIWAN - Flashpoint critico Asia-Pacifico")
            
        if "Ukraine" in countries and "Russia" in countries:
            dynamics.append("๐Ÿšจ CONFLITTO ATTIVO - Europa orientale instabile")
        
        return dynamics
    
    def identify_trends(self, data):
        """Identifica trend dai dati real-time"""
        trends = []
        
        if not data:
            return ["๐Ÿ“Š Dati insufficienti per trend analysis"]
        
        # Analisi frequenza keywords nelle notizie
        all_text = ""
        for item in data:
            if isinstance(item, dict):
                all_text += f" {item.get('title', '')} {item.get('description', '')}"
        
        trend_keywords = {
            "militarizzazione": ["military", "defense", "weapon", "missile", "nuclear"],
            "sanzioni_economiche": ["sanction", "embargo", "tariff", "economic pressure"],
            "diplomazia": ["summit", "negotiation", "agreement", "treaty", "dialogue"],
            "instabilitร ": ["crisis", "tension", "conflict", "unstable", "volatile"]
        }
        
        for trend, keywords in trend_keywords.items():
            count = sum(all_text.lower().count(keyword) for keyword in keywords)
            if count >= 2:
                trends.append(f"๐Ÿ“ˆ TREND: {trend.upper()} ({count} menzioni)")
        
        return trends if trends else ["๐Ÿ“Š Pattern stabili - Nessun trend anomalo"]
    
    def calculate_risks(self, entities, data):
        """Calcola livelli di rischio"""
        risks = []
        risk_score = 0
        
        # Fattori di rischio
        high_risk_combinations = [
            (["Russia", "Ukraine"], "Escalation conflitto"),
            (["China", "Taiwan"], "Crisi Taiwan Strait"),
            (["Iran", "Israel"], "Conflitto Medio Oriente"),
            (["North Korea", "South Korea"], "Tensione coreana")
        ]
        
        countries = list(entities.get("countries", []))
        
        for combo, risk_desc in high_risk_combinations:
            if all(country in countries for country in combo):
                risks.append(f"๐Ÿšจ ALTO RISCHIO: {risk_desc}")
                risk_score += 3
        
        # Rischio sanzioni
        if "sanctions" in entities.get("keywords", []):
            risks.append("๐Ÿ’ฐ RISCHIO ECONOMICO: Impatti sanzionatori")
            risk_score += 2
            
        # Rischio militare
        if any(keyword in entities.get("keywords", []) for keyword in ["military", "nuclear", "missile"]):
            risks.append("โš”๏ธ RISCHIO MILITARE: Escalation possibile")
            risk_score += 2
        
        # Calcola livello generale
        if risk_score >= 5:
            risks.insert(0, "๐Ÿ”ด LIVELLO RISCHIO: CRITICO")
        elif risk_score >= 3:
            risks.insert(0, "๐ŸŸก LIVELLO RISCHIO: ELEVATO")
        else:
            risks.insert(0, "๐ŸŸข LIVELLO RISCHIO: MODERATO")
        
        return risks
    
    def generate_scenarios(self, query, entities):
        """Genera scenari futuri basati su AI"""
        scenarios = []
        
        countries = list(entities.get("countries", []))
        keywords = list(entities.get("keywords", []))
        
        # Scenari basati su pattern
        if "Russia" in countries and "Ukraine" in countries:
            scenarios.extend([
                "๐Ÿ“Š SCENARIO A: Escalation โ†’ Coinvolgimento NATO diretto",
                "๐Ÿ“Š SCENARIO B: Stallo โ†’ Guerra di logoramento prolungata",
                "๐Ÿ“Š SCENARIO C: Negoziato โ†’ Cessate il fuoco territoriale"
            ])
        
        elif "China" in countries and "Taiwan" in countries:
            scenarios.extend([
                "๐Ÿ“Š SCENARIO A: Blockade โ†’ Crisi economica globale",
                "๐Ÿ“Š SCENARIO B: Status quo โ†’ Tensione controllata",
                "๐Ÿ“Š SCENARIO C: Riunificazione โ†’ Shock geopolitico"
            ])
        
        else:
            # Scenari generici
            scenarios.extend([
                "๐Ÿ“Š SCENARIO A: Stabilizzazione โ†’ Ritorno alla normalitร ",
                "๐Ÿ“Š SCENARIO B: Escalation โ†’ Aumento delle tensioni",
                "๐Ÿ“Š SCENARIO C: Frammentazione โ†’ Nuovi equilibri regionali"
            ])
        
        return scenarios
    
    def derive_strategic_implications(self, entities, data):
        """Deriva implicazioni strategiche"""
        implications = []
        
        countries = list(entities.get("countries", []))
        orgs = list(entities.get("organizations", []))
        
        # Implicazioni per alleanze
        if "NATO" in orgs:
            implications.append("๐Ÿ›ก๏ธ NATO: Rafforzamento deterrenza e coesione alleanza")
        
        if "EU" in orgs or "European Union" in orgs:
            implications.append("๐Ÿ‡ช๐Ÿ‡บ UE: Necessitร  autonomia strategica e difesa comune")
        
        # Implicazioni economiche
        if any(country in ["China", "USA", "Germany"] for country in countries):
            implications.append("๐Ÿ’ผ COMMERCIO: Riconfigurazione catene globali del valore")
        
        # Implicazioni tecnologiche
        if "China" in countries and "USA" in countries:
            implications.append("๐Ÿ”ฌ TECH: Accelerazione decoupling tecnologico")
        
        # Implicazioni energetiche
        if "Russia" in countries:
            implications.append("โšก ENERGIA: Diversificazione fonti e fornitori")
        
        return implications
    
    def analyze_geopolitical_situation(self, query):
        """Analisi geopolitica completa con dati real-time + AI"""
        
        try:
            # 1. Recupera dati real-time
            news_data = self.fetch_real_time_news()
            economic_data = self.fetch_economic_indicators()
            
            # 2. Estrai entitร  dai dati real-time + query
            combined_data = news_data + [{"title": query, "description": ""}]
            entities = self.extract_geopolitical_entities(combined_data)
            
            # 3. AI Generativa Analysis
            ai_analysis = self.ai_generative_analysis(query, news_data, entities)
            
            # 4. Genera report completo
            report = self.generate_comprehensive_report(query, news_data, entities, ai_analysis)
            
            return report
            
        except Exception as e:
            return f"โŒ Errore nell'analisi real-time: {str(e)}\n\nRitenta tra qualche secondo."
    
    def generate_comprehensive_report(self, query, news_data, entities, ai_analysis):
        """Genera report completo con tutti i dati"""
        
        report_parts = []
        
        # Header con timestamp
        report_parts.append("๐ŸŒ GEOPOLITICAL INTELLIGENCE REPORT")
        report_parts.append("=" * 55)
        report_parts.append(f"๐Ÿ• Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S UTC')}")
        report_parts.append("๐Ÿ“ก Sources: Real-time RSS feeds + AI Analysis")
        report_parts.append("")
        
        # Query Analysis
        report_parts.append(f"๐ŸŽฏ QUERY: {query}")
        report_parts.append("")
        
        # Real-time News Context
        if news_data:
            report_parts.append("๐Ÿ“ฐ REAL-TIME NEWS CONTEXT:")
            for i, news in enumerate(news_data[:5], 1):
                report_parts.append(f"  {i}. [{news['source']}] {news['title'][:80]}...")
            report_parts.append("")
        
        # Entities Detected
        report_parts.append("๐ŸŽญ ENTITIES DETECTED (REAL-TIME):")
        if entities['countries']:
            report_parts.append(f"  ๐Ÿ›๏ธ Countries: {', '.join(list(entities['countries'])[:8])}")
        if entities['organizations']:
            report_parts.append(f"  ๐Ÿข Organizations: {', '.join(list(entities['organizations'])[:6])}")
        if entities['keywords']:
            report_parts.append(f"  ๐Ÿ”‘ Keywords: {', '.join(list(entities['keywords'])[:8])}")
        report_parts.append("")
        
        # AI Situation Assessment
        report_parts.append("๐Ÿค– AI SITUATION ASSESSMENT:")
        for assessment in ai_analysis['situation_assessment']:
            report_parts.append(f"  {assessment}")
        report_parts.append("")
        
        # Power Dynamics
        if ai_analysis['power_dynamics']:
            report_parts.append("โšก POWER DYNAMICS ANALYSIS:")
            for dynamic in ai_analysis['power_dynamics']:
                report_parts.append(f"  {dynamic}")
            report_parts.append("")
        
        # Trend Analysis
        report_parts.append("๐Ÿ“ˆ TREND ANALYSIS (DATA-DRIVEN):")
        for trend in ai_analysis['trend_analysis']:
            report_parts.append(f"  {trend}")
        report_parts.append("")
        
        # Risk Assessment
        report_parts.append("โš ๏ธ RISK ASSESSMENT:")
        for risk in ai_analysis['risk_assessment']:
            report_parts.append(f"  {risk}")
        report_parts.append("")
        
        # Future Scenarios
        report_parts.append("๐Ÿ”ฎ AI-GENERATED SCENARIOS:")
        for scenario in ai_analysis['scenario_generation']:
            report_parts.append(f"  {scenario}")
        report_parts.append("")
        
        # Strategic Implications
        report_parts.append("๐ŸŽฏ STRATEGIC IMPLICATIONS:")
        for implication in ai_analysis['strategic_implications']:
            report_parts.append(f"  {implication}")
        report_parts.append("")
        
        # Data Sources Footer
        report_parts.append("๐Ÿ“Š DATA PIPELINE:")
        report_parts.append("  โ€ข Real-time RSS feeds (Reuters, BBC, UN)")
        report_parts.append("  โ€ข World Bank economic indicators")
        report_parts.append("  โ€ข NLP entity extraction")
        report_parts.append("  โ€ข AI generative analysis")
        report_parts.append("  โ€ข Pattern recognition algorithms")
        report_parts.append("")
        
        report_parts.append(f"๐Ÿ”„ Next update: {(datetime.now() + timedelta(minutes=30)).strftime('%H:%M UTC')}")
        
        return "\n".join(report_parts)

# Inizializza analyzer real-time
analyzer = RealTimeGeopoliticalAnalyzer()

def analyze_real_time(user_query):
    """Main function per Gradio con real-time data"""
    if not user_query.strip():
        return "โŒ Inserisci una query per l'analisi geopolitica real-time."
    
    # Mostra loading message
    loading_msg = "๐Ÿ”„ Recuperando dati real-time da fonti globali...\nโณ Analisi AI in corso..."
    
    return analyzer.analyze_geopolitical_situation(user_query)

# Esempi con focus real-time
examples = [
    "Analizza la situazione attuale in Ucraina e le implicazioni NATO",
    "Tensioni USA-Cina: ultimi sviluppi e impatti commerciali", 
    "Crisi energetica europea: dipendenza russa e alternative",
    "Escalation Medio Oriente: Iran, Israele e equilibri regionali",
    "BRICS expansion: sfida all'ordine occidentale?",
    "Taiwan crisis: preparativi militari e deterrenza USA"
]

# Interface Gradio Real-Time
demo = gr.Interface(
    fn=analyze_real_time,
    inputs=[
        gr.Textbox(
            label="Geopolitical Query", 
            placeholder="Es: Analizza gli ultimi sviluppi del conflitto in Ucraina e le reazioni internazionali...",
            lines=3
        )
    ],
    outputs=[
        gr.Textbox(
            label="Real-Time Geopolitical Intelligence Report",
            lines=30,
            max_lines=40
        )
    ],
    title="๐ŸŒ Real-Time Geopolitical Intelligence AI",
    description="""
    **๐Ÿš€ AI Geopolitica con dati real-time + analisi generativa**
    
    ๐Ÿ”ฅ **Pipeline avanzata:**
    โ€ข ๐Ÿ“ก **Real-time data**: RSS feeds globali (Reuters, BBC, UN News)
    โ€ข ๐Ÿค– **AI Generativa**: Analisi situazionale, trend, scenari futuri
    โ€ข ๐ŸŽฏ **NLP avanzato**: Estrazione entitร  e pattern recognition
    โ€ข โšก **Risk assessment**: Calcolo rischi e implicazioni strategiche
    
    ๐Ÿ’ก **Capabilities:**
    โ€ข Analisi situazioni in evoluzione con dati fresh
    โ€ข Generazione scenari futuri AI-driven
    โ€ข Assessment rischi geopolitici quantificati
    โ€ข Intelligence strategica per decision makers
    
    โฑ๏ธ Dati aggiornati ogni 30 minuti da fonti pubbliche globali
    """,
    examples=examples,
    theme=gr.themes.Base(),
    css="""
    .gradio-container {
        max-width: 1000px;
        margin: auto;
    }
    .description {
        background: linear-gradient(90deg, #1e3c72, #2a5298);
        color: white;
        padding: 20px;
        border-radius: 10px;
    }
    """
)

if __name__ == "__main__":
    demo.launch()