#!/usr/bin/env python3
"""IRIDAA Forge CLI v0.4"""
import argparse, json, os, shutil, subprocess, sys, urllib.request

FORGE_BASE = os.environ.get('IRIDAA_FORGE_BASE', 'https://iridaa.com/forge/api')
FORGE_REPO = os.environ.get('IRIDAA_FORGE_REPO', 'https://iridaa.com/forge/repo')
VERSION = '0.4'


def fetch_json(url):
    req = urllib.request.Request(url, headers={'User-Agent': f'IRIDAA-CLI/{VERSION}'})
    with urllib.request.urlopen(req, timeout=30) as r:
        return json.loads(r.read().decode('utf-8'))

def apps_index(): return fetch_json(FORGE_BASE.rstrip('/') + '/apps.json')
def app_manifest(app_id): return fetch_json(FORGE_BASE.rstrip('/') + f'/apps/{app_id}.json')
def repo_index(): return fetch_json(FORGE_REPO.rstrip('/') + '/index.json')
def repo_manifest(app_id): return fetch_json(FORGE_REPO.rstrip('/') + f'/packages/{app_id}.json')

def print_app(app):
    pkg=app.get('package',{}); ver=app.get('verification',{})
    print(f"{app.get('id')} — {app.get('name')}")
    print(f"  kategori: {app.get('cat')}")
    print(f"  trust: {app.get('score')}  risk: {ver.get('risk','unknown')}")
    print(f"  lisans: {app.get('license')}")
    print(f"  özet: {app.get('summary')}")
    print(f"  iridaa: {app.get('iridaa_install') or app.get('commands',{}).get('iridaa')}")
    print(f"  paket: {pkg.get('type')} / {pkg.get('repo')} / {pkg.get('id')}")
    print(f"  kaynak: {app.get('source')}")

def verify_manifest(app):
    ver=app.get('verification') or {}; pkg=app.get('package') or {}
    ok=True
    checks=[]
    def add(name, state, detail=''):
        nonlocal ok
        checks.append((name,state,detail)); ok = ok and bool(state)
    add('official_source', ver.get('official_source') is True, app.get('source',''))
    add('verified_by_iridaa', ver.get('verified_by_iridaa') is True, ver.get('verification_level',''))
    add('package_type', pkg.get('type') in ('flatpak','docker','apt','appimage','manual'), pkg.get('type',''))
    add('package_id', bool(pkg.get('id')), pkg.get('id',''))
    add('trust_score', int(app.get('score') or 0) >= 65, str(app.get('score')))
    add('manifest_sha256', bool(ver.get('manifest_sha256')), (ver.get('manifest_sha256') or '')[:16])
    return ok, checks

def print_trust(app):
    print_app(app)
    ok, checks = verify_manifest(app)
    print('\nDoğrulama:')
    for name,state,detail in checks:
        print(f"  {'✓' if state else '✗'} {name}: {detail}")
    ver=app.get('verification') or {}
    for note in ver.get('notes',[]): print(f"  not: {note}")
    print(f"\nSonuç: {'güvenli kurulum için uygun' if ok else 'dikkat gerekiyor'}")
    return ok

def command_for(app):
    pkg=app.get('package',{}); ptype=pkg.get('type'); pid=pkg.get('id')
    if ptype=='flatpak': return ['flatpak','install','-y','flathub',pid]
    if ptype=='apt': return ['sudo','apt','install','-y',pid]
    if ptype=='docker': return ['docker','pull',pid]
    return None

def update_command(app=None):
    if app:
        ptype=(app.get('package') or {}).get('type')
        pid=(app.get('package') or {}).get('id')
        if ptype=='flatpak': return ['flatpak','update','-y',pid]
        if ptype=='docker': return ['docker','pull',pid]
        if ptype=='apt': return ['sudo','apt','install','--only-upgrade','-y',pid]
        return None
    return ['flatpak','update','-y']

def ensure_tool(app_or_type):
    ptype=app_or_type if isinstance(app_or_type,str) else (app_or_type.get('package') or {}).get('type')
    if ptype=='flatpak' and not shutil.which('flatpak'):
        print('Hata: flatpak yüklü değil. Önce: sudo apt install flatpak', file=sys.stderr); return False
    if ptype=='docker' and not shutil.which('docker'):
        print('Hata: docker yüklü değil.', file=sys.stderr); return False
    return True

def cmd_list(args):
    data=apps_index(); apps=data.get('apps',[])
    for app in apps: print(f"{app['id']:<18} {app['name']:<26} {app['cat']:<18} trust:{app['score']}")
    print(f"\n{len(apps)} uygulama · IRIDAA Forge {data.get('version')}")

def cmd_search(args):
    q=' '.join(args.query).lower(); found=[]
    for app in apps_index().get('apps',[]):
        hay=' '.join(str(app.get(k,'')) for k in ['id','name','cat','summary','license']).lower()
        if q in hay: found.append(app)
    for app in found: print(f"{app['id']:<18} {app['name']:<26} {app['cat']:<18} trust:{app['score']}")
    print(f"\n{len(found)} sonuç")

def cmd_show(args): print_app(app_manifest(args.app_id))
def cmd_trust(args): return 0 if print_trust(app_manifest(args.app_id)) else 1

def cmd_repo(args):
    idx=repo_index()
    print(f"IRIDAA Forge Repo {idx.get('version')} · {idx.get('package_count')} paket")
    for p in idx.get('packages',[])[:80]: print(f"{p['id']:<18} {p['type']:<8} trust:{p['trust_score']} risk:{p['risk']}")

def cmd_install(args):
    app=app_manifest(args.app_id); print_app(app)
    if args.verify:
        if not print_trust(app):
            print('Kurulum durduruldu: doğrulama başarısız.'); return 3
    cmd=command_for(app); upstream=(app.get('package') or {}).get('upstream_install')
    if not cmd:
        print('\nBu paket otomatik kurulum için güvenli komuta dönüştürülmedi.')
        print(f"Kaynak kurulum: {upstream}"); return 0
    print('\nÇalıştırılacak komut:'); print('  '+' '.join(cmd))
    if args.dry_run: print('dry-run: kurulum yapılmadı.'); return 0
    if not args.yes:
        ans=input('Devam edilsin mi? [y/N] ').strip().lower()
        if ans not in ('y','yes','e','evet'): print('İptal edildi.'); return 1
    if not ensure_tool(app): return 2
    return subprocess.call(cmd)

def cmd_update(args):
    app=app_manifest(args.app_id) if args.app_id else None
    if app and args.verify: print_trust(app)
    cmd=update_command(app)
    if not cmd:
        print('Bu paket tipi için otomatik update yok.'); return 0
    print('Çalıştırılacak komut:'); print('  '+' '.join(cmd))
    if args.dry_run: print('dry-run: güncelleme yapılmadı.'); return 0
    ptype=(app.get('package') or {}).get('type') if app else 'flatpak'
    if not ensure_tool(ptype): return 2
    return subprocess.call(cmd)

def main():
    parser=argparse.ArgumentParser(prog='iridaa', description='IRIDAA Forge CLI')
    parser.add_argument('--version', action='version', version=f'IRIDAA CLI {VERSION}')
    sub=parser.add_subparsers(dest='cmd', required=True)
    sub.add_parser('list').set_defaults(func=cmd_list)
    p=sub.add_parser('search'); p.add_argument('query', nargs='+'); p.set_defaults(func=cmd_search)
    p=sub.add_parser('show'); p.add_argument('app_id'); p.set_defaults(func=cmd_show)
    p=sub.add_parser('trust'); p.add_argument('app_id'); p.set_defaults(func=cmd_trust)
    sub.add_parser('repo').set_defaults(func=cmd_repo)
    p=sub.add_parser('install'); p.add_argument('app_id'); p.add_argument('--dry-run', action='store_true'); p.add_argument('--verify', action='store_true'); p.add_argument('-y','--yes', action='store_true'); p.set_defaults(func=cmd_install)
    p=sub.add_parser('update'); p.add_argument('app_id', nargs='?'); p.add_argument('--dry-run', action='store_true'); p.add_argument('--verify', action='store_true'); p.set_defaults(func=cmd_update)
    args=parser.parse_args()
    try: raise SystemExit(args.func(args) or 0)
    except urllib.error.HTTPError as e: print(f'Forge manifest bulunamadı veya erişilemedi: HTTP {e.code}', file=sys.stderr); raise SystemExit(4)
    except Exception as e: print(f'Hata: {e}', file=sys.stderr); raise SystemExit(5)
if __name__=='__main__': main()
