#!/usr/bin/python3
"""KRunner D-Bus eklentisi (org.kde.krunner1): sorgu katalogdaki kurulu olmayan bir uygulamaya
uyarsa "kur" önerisi; seçilince MHMT Merkezi o uygulama işaretli açılır (karar #50).
D-Bus etkinleştirmesiyle başlar, 10 dakika sorgu gelmezse çıkar."""
import subprocess
import sys

sys.path.insert(0, "/usr/lib/mhmt/python")

import dbus  # noqa: E402
import dbus.service  # noqa: E402
from dbus.mainloop.glib import DBusGMainLoop  # noqa: E402
from gi.repository import GLib  # noqa: E402

from mhmt_cli import katalog, uygulama  # noqa: E402
from mhmt_cli.dil import t  # noqa: E402

AD = "org.mhmt.krunner"
ARAYUZ = "org.kde.krunner1"
BEKLEME_SN = 600
TAM, OLASI = 100, 30


class Calistirici(dbus.service.Object):
    def __init__(self, oturum, dongu):
        super().__init__(dbus.service.BusName(AD, oturum), "/runner")
        self.dongu = dongu
        self.ogeler = [o for g in katalog.gruplar() for o in g["ogeler"]]
        self.zaman = None
        self.sure_yenile()

    def sure_yenile(self):
        if self.zaman:
            GLib.source_remove(self.zaman)
        self.zaman = GLib.timeout_add_seconds(BEKLEME_SN, self.dongu.quit)

    @dbus.service.method(ARAYUZ, out_signature="a(sss)")
    def Actions(self):
        return []

    @dbus.service.method(ARAYUZ, in_signature="s", out_signature="a(sssida{sv})")
    def Match(self, sorgu):
        self.sure_yenile()
        q = sorgu.strip().lower()
        if len(q) < 3:
            return []
        adaylar = []
        for o in self.ogeler:
            adlar = [o["id"], o["ad"].lower(), o.get("ad_en", "").lower()] + o.get("apt", [])
            if q in adlar:
                adaylar.append((TAM, 1.0, o))
            elif any(a.startswith(q) for a in adlar if a):
                adaylar.append((OLASI, 0.7, o))
        sonuc = []
        for tur, onem, o in sorted(adaylar, key=lambda x: -x[1])[:5]:
            if uygulama.durum(o) != "yok":
                continue
            sonuc.append((o["id"], t(f"{katalog.ad(o)} kur", f"Install {katalog.ad(o)}"), "system-software-install",
                          tur, onem, {"subtext": f"[{katalog.kaynak(o)}] {katalog.aciklama(o)}"}))
        return sonuc

    @dbus.service.method(ARAYUZ, in_signature="ss")
    def Run(self, kimlik, _eylem):
        subprocess.Popen(["mhmt-merkez", "--kur", kimlik], start_new_session=True)

    @dbus.service.method(ARAYUZ)
    def Teardown(self):
        self.sure_yenile()


def main():
    DBusGMainLoop(set_as_default=True)
    dongu = GLib.MainLoop()
    Calistirici(dbus.SessionBus(), dongu)
    dongu.run()


if __name__ == "__main__":
    main()
