import sys
from pathlib import Path

# Add project root to sys.path
BASE_DIR = Path(__file__).resolve().parent
sys.path.insert(0, str(BASE_DIR))

# Ensure UTF-8 output on Windows terminal
if sys.platform == "win32":
    import io
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')


from app.storage.database import (
    init_db,
    create_scheduled_post,
    get_scheduled_posts,
    add_auto_reply_rule,
    get_auto_reply_rules
)
from app.api.ai_generator import (
    generate_ai_caption,
    generate_content_calendar_plan,
    generate_smart_hashtags
)
from app.api import mock_data

def run_tests():
    print("=" * 50)
    print("Menjalankan Pengujian Komponen IG-Optimizer...")
    print("=" * 50)

    # 1. Test Database
    print("\n[1] Menguji Inisialisasi Database SQLite...")
    init_db()
    rules = get_auto_reply_rules()
    assert len(rules) >= 4, f"Ekspektasi minimal 4 auto-reply default, didapat: {len(rules)}"
    print(f"  ✓ Berhasil! Ditemukan {len(rules)} aturan auto-reply awal.")

    # 2. Test Scheduler Database
    print("\n[2] Menguji Penjadwalan Konten...")
    post_id = create_scheduled_post(
        caption="Tes Postingan Optimasi",
        media_url="https://example.com/test.jpg",
        media_type="IMAGE",
        scheduled_time="2026-09-10T19:00:00"
    )
    posts = get_scheduled_posts()
    assert any(p["id"] == post_id for p in posts), "Postingan tidak ditemukan di database"
    print(f"  ✓ Berhasil menyimpan dan mengambil jadwal postingan ID #{post_id}!")

    # 3. Test AI Caption Generator
    print("\n[3] Menguji Generator Caption AI...")
    caption_res = generate_ai_caption(
        topic="3 Kesalahan Fatal Algoritma Instagram",
        tone="Edukatif",
        content_type="CAROUSEL",
        audience="Kreator & Bisnis Online"
    )
    assert "primary_hook" in caption_res
    assert "caption" in caption_res
    assert "hashtags" in caption_res
    print("  ✓ Berhasil membuat caption & hook:")
    print(f"    Hook: {caption_res['primary_hook']}")
    print(f"    Hashtag: {caption_res['hashtags']['all_joined']}")

    # 4. Test Content Calendar Blueprint
    print("\n[4] Menguji Kalender Konten 7 Hari AI...")
    calendar_plan = generate_content_calendar_plan("Bisnis Fashion Online", 7)
    assert len(calendar_plan) == 7, f"Ekspektasi 7 hari kalender, didapat {len(calendar_plan)}"
    print("  ✓ Berhasil membuat kalender 7 hari:")
    for item in calendar_plan[:3]:
        print(f"    - {item['day']}: {item['topic']} ({item['format']} | {item['best_time']})")

    # 5. Test Mock Analytics & Best Times
    print("\n[5] Menguji Engine Analitik & Heatmap Waktu Terbaik...")
    summary = mock_data.get_mock_analytics_summary()
    assert summary["avg_engagement_rate"] > 0
    best_times = mock_data.get_mock_best_posting_times()
    assert len(best_times["days"]) == 7
    assert len(best_times["matrix"]) == 7
    print(f"  ✓ Analitik OK: Followers {summary['followers']}, Engagement {summary['avg_engagement_rate']}%")
    print(f"  ✓ Heatmap OK: {len(best_times['days'])} hari dengan data 24 jam.")

    print("\n" + "=" * 50)
    print("🎉 SEMUA PENGUJIAN BERHASIL 100%!")
    print("=" * 50)

if __name__ == "__main__":
    run_tests()
