// fikoyt-eklenti-usb (SDK surumu, Asama 4.2): USB surucu takma/cikarma bildirimi.
// Protokol 2 (SDK): cerceveli JSON-RPC. Surekli calisan eklenti: acilista Windows dinleyiciyi
// baslatir; baslangic durumu ve takma/cikarma olaylarini fikoyt/olay bildirimiyle yollar.
// Web tarafi olaylari eskisi gibi FikoYT.bridge.eklenti.olay uzerinden alir (veri bicimi ayni).
// Islemler: tara (guncel surucu listesini olay olarak iletir). Ayari bridge fikoyt/ayar ile verir.
// Platformdan bagimsiz mantik usb.go, Windows dinleyici usb_windows.go icinde.
package main

import (
	"context"
	"encoding/json"
	"errors"
	"os"

	sdk "fikoyt-eklenti-sdk"
)

func main() {
	e := sdk.Yeni("usb").Havuz(1)

	// Arka plan izleme dongusu ve Windows dinleyici, acilis adiminda baslar:
	// stdin okumadan once bir kez calisir, boylece olay akisi hemen devreye girer.
	e.Acilis(func() {
		tetik := make(chan struct{}, 1)
		if err := dinleyiciBaslat(func() {
			select {
			case tetik <- struct{}{}:
			default:
			}
		}); err != nil {
			e.Gunlukle("usb dinleyici baslatilamadi: %v", err)
			return
		}
		ctx := context.Background()
		go izle(ctx, taraSuruculer, olayYolla(e), tetik, ayarAl(e))
	})

	e.Kayit("tara", func(c *sdk.Cagri) (any, error) {
		liste, err := taraSuruculer()
		if err != nil {
			return nil, errors.New("sürücüler okunamadı")
		}
		// Web surucu listesini olay kanalindan alir (eski davranisin aynisi: tip=durum).
		if err := c.OlayGonder(Mesaj{Tip: "durum", Suruculer: liste}); err != nil {
			return nil, err
		}
		return map[string]bool{"tamam": true}, nil
	})

	// Girdi kapaninca (bridge sureci durdurunca) Calistir doner; surec temiz biter.
	_ = e.Calistir(os.Stdin, os.Stdout)
}

// olayYolla: izle dongusunun urettigi mesajlari (baslangic durumu, takildi/cikarildi)
// bridge'e bildirim olarak yollar. Web bu olaylari ayni veri bicimiyle alir.
func olayYolla(e *sdk.Eklenti) func(Mesaj) {
	return func(m Mesaj) {
		if err := e.OlayGonder(m); err != nil {
			e.Gunlukle("olay gonderilemedi: %v", err)
		}
	}
}

// ayarAl: izle dongusunun her olayta cagirdigi, o anki ayari Ayar yapisina ceviren fonksiyon.
// Ayar bridge'den fikoyt/ayar ile gelir ve SDK'da tutulur; hic verilmediyse varsayilan kullanilir.
func ayarAl(e *sdk.Eklenti) func() Ayar {
	return func() Ayar {
		a := varsayilanAyar()
		if ham := e.Ayar(); len(ham) > 0 {
			var g Ayar
			if json.Unmarshal(ham, &g) == nil {
				a = g
			}
		}
		return a
	}
}
