# =====================================================================================
# SCRIPT PYTHON UNTUK SINKRONISASI GOOGLE TRENDS KE FIREBASE FIRESTORE
# =====================================================================================
# Pastikan Anda sudah menginstal:
# pip install firebase-admin pytrends
#
# Dan pastikan file 'serviceAccountKey.json' berada di folder yang sama.
# =====================================================================================

import sys
import json
import os

# --- KONFIGURASI OUTPUT ---
JSON_MODE = '--json' in sys.argv
log_buffer = []

def log_print(msg):
    if JSON_MODE:
        log_buffer.append(str(msg))
    else:
        print(msg)

# Force UTF-8 output (Python 3.7+)
try:
    if hasattr(sys.stdout, 'reconfigure'):
        sys.stdout.reconfigure(encoding='utf-8')
except:
    pass

try:
    import firebase_admin
    from firebase_admin import credentials, firestore
    from pytrends.request import TrendReq
    from datetime import datetime
    import time 
except ImportError as e:
    log_print(f"❌ Critical Error: Missing Python Library. {e}")
    if JSON_MODE:
        print(json.dumps({'status': 'error', 'message': str(e), 'logs': log_buffer}))
    sys.exit(1)

# --- KONFIGURASI FIREBASE ---
# Pastikan file serviceAccountKey.json berada di direktori yang sama
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
SERVICE_ACCOUNT_KEY_FILE = os.path.join(BASE_DIR, 'serviceAccountKey.json')

try:
    cred = credentials.Certificate(SERVICE_ACCOUNT_KEY_FILE)
    firebase_admin.initialize_app(cred)
    db = firestore.client()
    log_print("✅ Firebase berhasil diinisialisasi.")
except FileNotFoundError:
    log_print(f"❌ ERROR: File '{SERVICE_ACCOUNT_KEY_FILE}' tidak ditemukan.")
    log_print("Pastikan Anda sudah mengunduh Service Account Key JSON dari Firebase dan menamainya 'serviceAccountKey.json'.")
    if JSON_MODE: print(json.dumps({'status': 'error', 'logs': log_buffer})); exit()
    exit()
except Exception as e:
    log_print(f"❌ ERROR saat inisialisasi Firebase: {e}")
    if JSON_MODE: print(json.dumps({'status': 'error', 'logs': log_buffer})); exit()
    exit()


# --- KONFIGURASI PYTRENDS ---
GEO = 'ID' 
CATEGORY_ID = '395' 

# Daftar User-Agents yang berbeda untuk dicoba, guna menghindari pemblokiran 404/429
USER_AGENTS = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'
]
MAX_RETRIES = len(USER_AGENTS)

# --- FUNGSI UTAMA ---
def fetch_and_sync_trends():
    """Mengambil topik trending harian dari Google Trends dan menyimpannya ke Firestore."""
    
    topics_list = []
    success = False
    
    # 1. Loop mencoba User-Agents berbeda untuk mengatasi 404/429
    for i, user_agent in enumerate(USER_AGENTS):
        log_print(f"🔄 Percobaan {i + 1}/{MAX_RETRIES} dengan User-Agent berbeda...")
        
        # 1a. Inisialisasi Pytrends dengan User-Agent saat ini
        pytrends = TrendReq(
            hl='id-ID', 
            tz=420, 
            requests_args={'headers': {'User-Agent': user_agent}}
        ) 
        
        log_print(f"⏳ Mengambil data Daily Tren dari Google Trends (Geo: {GEO})...")

        try:
            # 2. Ambil Daily Trending Searches (Indonesia)
            trending_searches = pytrends.trending_searches(pn=GEO)
            
            # 3. Ekstrak Topik
            # Di Daily Trends, kolom [0] berisi query/judul tren. Ambil 10 teratas.
            topics_list = trending_searches[0].head(10).tolist()
            log_print("✅ Berhasil terhubung dan mendapatkan data tren.")
            success = True
            break # Jika sukses, keluar dari loop retry

        except Exception as e:
            # Jika terjadi error 404, coba lagi dengan User-Agent berikutnya
            if "code 404" in str(e) or "code 429" in str(e):
                log_print(f"❌ Gagal pada percobaan {i + 1} (404/429). Mencoba User-Agent berikutnya...")
                time.sleep(5) # <-- Waktu tunggu ditingkatkan dari 3 menjadi 5 detik
                continue
            else:
                # Jika error lain yang kritis, hentikan dan tampilkan error
                log_print(f"\n❌ ERROR Kritis saat mengambil data: {e}")
                # Hentikan proses sinkronisasi dan gunakan fallback
                break 

    # 4. Filter, Bersihkan, dan Sinkronisasi Topik
    
    # Jika berhasil dari loop try/retry
    if success:
        final_topics = [
            topic.strip()
            for topic in topics_list
            if len(topic.split()) > 1 and (
                "travel" in topic.lower() or 
                "wisata" in topic.lower() or 
                "bandara" in topic.lower() or 
                "sewa" in topic.lower() or 
                "liburan" in topic.lower() or
                "jakarta" in topic.lower() or
                "bandung" in topic.lower()
            )
        ]
        
        if len(final_topics) < 3 and topics_list:
            final_topics = topics_list
        
        log_print(f"✅ Berhasil mendapatkan {len(final_topics)} topik untuk disinkronkan.")

    # Jika semua percobaan gagal (success == False)
    else:
        log_print("⚠️ Semua percobaan gagal. Menggunakan fallback statis.")
        final_topics = [
            "Jadwal Travel Bandung Jakarta Terkini",
            "Harga Drop Private Bandara Halim",
            "Destinasi Wisata Bandung Murah",
            "Tips Naik Pesawat Bersama Anak"
        ]

    # 5. Sinkronisasi ke Firestore
    try:
        doc_ref = db.collection('trend_data').document('current')
        data_to_sync = {
            'topics': final_topics,
            'updated_at': datetime.now(),
            'source': 'pytrends'
        }
        
        doc_ref.set(data_to_sync)
        
        # Logika output diubah sedikit agar lebih jelas saat fallback
        if success:
            log_print("\n===================================================================")
            log_print("✅ SINKRONISASI SUKSES!")
            log_print(f"Data tren terbaru ({len(final_topics)} topik) berhasil disimpan ke: /trend_data/current")
            log_print("===================================================================")
        else:
            log_print("\n===================================================================")
            log_print("⚠️ SINKRONISASI SEBAGIAN SUKSES (Menggunakan Fallback)!")
            log_print(f"Data fallback statis ({len(final_topics)} topik) berhasil disimpan ke: /trend_data/current")
            log_print("===================================================================")

        if JSON_MODE:
            print(json.dumps({
                'status': 'success',
                'topics': final_topics,
                'logs': log_buffer,
                'updated_at': datetime.now().isoformat()
            }))

    except Exception as e:
        log_print(f"\n❌ ERROR saat menyimpan data (Izin/Koneksi Firestore): {e}")
        log_print("Pastikan Service Account Anda memiliki izin 'write' di Firestore.")
        if JSON_MODE:
            print(json.dumps({
                'status': 'error',
                'message': str(e),
                'logs': log_buffer
            }))


if __name__ == "__main__":
    fetch_and_sync_trends()