"""
InsightFace ONNX modellerini indir.
Alternatif kaynaklar kullanılır (HuggingFace gated olduğu için).
"""

import os
import urllib.request
import sys
import zipfile
import glob

MODELS_DIR = "/models"
os.makedirs(MODELS_DIR, exist_ok=True)

# insightface paketini kullanarak model indir
def insightface_ile_indir():
    """insightface kütüphanesinin kendi model indirme mekanizmasını kullan"""
    try:
        import insightface
        from insightface.app import FaceAnalysis

        # buffalo_l modelini indir (det_10g + w600k_r50 dahil)
        app = FaceAnalysis(name='buffalo_l', root='/tmp/insightface_models',
                           providers=['CPUExecutionProvider'])
        app.prepare(ctx_id=-1, det_size=(640, 640))

        # İndirilen modelleri /models'a kopyala
        import shutil
        model_dir = '/tmp/insightface_models/models/buffalo_l'
        for f in glob.glob(os.path.join(model_dir, '*.onnx')):
            dst = os.path.join(MODELS_DIR, os.path.basename(f))
            shutil.copy2(f, dst)
            size_mb = os.path.getsize(dst) / (1024 * 1024)
            print(f"[OK] {os.path.basename(f)} kopyalandı ({size_mb:.1f} MB)")
        return True
    except Exception as e:
        print(f"[UYARI] insightface ile indirme başarısız: {e}")
        return False


# Alternatif: doğrudan URL'lerden indir
ALT_URLS = {
    "det_10g.onnx": [
        "https://github.com/deepinsight/insightface/releases/download/v0.7/buffalo_l.zip",
    ],
}

def zip_ile_indir():
    """buffalo_l.zip dosyasından modelleri çıkar"""
    zip_url = "https://github.com/deepinsight/insightface/releases/download/v0.7/buffalo_l.zip"
    zip_path = "/tmp/buffalo_l.zip"

    try:
        print("[İndiriliyor] buffalo_l.zip ...")
        urllib.request.urlretrieve(zip_url, zip_path)
        size_mb = os.path.getsize(zip_path) / (1024 * 1024)
        print(f"[OK] buffalo_l.zip indirildi ({size_mb:.1f} MB)")

        with zipfile.ZipFile(zip_path, 'r') as z:
            for member in z.namelist():
                if member.endswith('.onnx'):
                    filename = os.path.basename(member)
                    target = os.path.join(MODELS_DIR, filename)
                    with z.open(member) as src, open(target, 'wb') as dst:
                        dst.write(src.read())
                    size_mb = os.path.getsize(target) / (1024 * 1024)
                    print(f"[OK] {filename} çıkarıldı ({size_mb:.1f} MB)")

        os.remove(zip_path)
        return True
    except Exception as e:
        print(f"[HATA] zip ile indirme başarısız: {e}")
        return False


if __name__ == "__main__":
    # Zaten mevcut mu kontrol et
    gerekli = ["det_10g.onnx", "w600k_r50.onnx"]
    mevcut = all(os.path.exists(os.path.join(MODELS_DIR, m)) for m in gerekli)
    if mevcut:
        for m in gerekli:
            size_mb = os.path.getsize(os.path.join(MODELS_DIR, m)) / (1024 * 1024)
            print(f"[OK] {m} zaten mevcut ({size_mb:.1f} MB)")
        print("\nTüm modeller hazır!")
        sys.exit(0)

    # Yöntem 1: GitHub releases'ten zip indir
    if zip_ile_indir():
        print("\nTüm modeller hazır!")
        sys.exit(0)

    # Yöntem 2: insightface paketi ile
    if insightface_ile_indir():
        print("\nTüm modeller hazır!")
        sys.exit(0)

    print("[HATA] Modeller indirilemedi!")
    sys.exit(1)
