package main

// Kurulu eklenti kayitlari (bridge-kurulu.json). Chrome'daki gibi: kurulu ama devre disi olabilir.
// Devre disi birakilan eklentinin tum site yetkileri dusurulur; yeniden acmak icin onay gerekir.
// Bu dosya indirme/calistirma yapmaz; yalnizca durumu tutar.

import (
	"encoding/json"
	"errors"
	"os"
	"path/filepath"
	"sync"
)

type kuruluEklenti struct {
	Anahtar string `json:"anahtar"`
	Surum   string `json:"surum"`
	Etkin   bool   `json:"etkin"`
	// Acilista: yalnizca imzali manifest bunu istediyse ve kullanici kurulumda onayladiysa true.
	Acilista bool `json:"acilista"`
}

// kuruluAcilistaListesi: acilista baslatilacak etkin eklentiler.
func kuruluAcilistaListesi() []kuruluEklenti {
	kuruluMu.Lock()
	defer kuruluMu.Unlock()
	var liste []kuruluEklenti
	for _, k := range kuruluListe {
		if k.Etkin && k.Acilista {
			liste = append(liste, k)
		}
	}
	return liste
}

var (
	kuruluMu     sync.Mutex
	kuruluListe  []kuruluEklenti
	errKuruluYok = errors.New("eklenti kurulu degil")
)

func kuruluDosyasi() (string, error) {
	klasor, err := veriKlasoru()
	if err != nil {
		return "", err
	}
	return filepath.Join(klasor, "bridge-kurulu.json"), nil
}

func kuruluYukle() error {
	yol, err := kuruluDosyasi()
	if err != nil {
		return err
	}
	veri, err := os.ReadFile(yol)
	if errors.Is(err, os.ErrNotExist) {
		return nil
	}
	if err != nil {
		return err
	}
	var liste []kuruluEklenti
	if err := json.Unmarshal(veri, &liste); err != nil {
		return err
	}
	kuruluMu.Lock()
	kuruluListe = liste
	kuruluMu.Unlock()
	return nil
}

// kuruluKaydetLocked: kuruluMu kilitliyken cagrilmali.
func kuruluKaydetLocked() error {
	yol, err := kuruluDosyasi()
	if err != nil {
		return err
	}
	veri, err := json.MarshalIndent(kuruluListe, "", "  ")
	if err != nil {
		return err
	}
	return os.WriteFile(yol, veri, 0o600)
}

// kuruluEkle: ayni anahtar varsa kaydi gunceller (guncelleme). Varsayilan: etkin.
func kuruluEkle(k kuruluEklenti) error {
	kuruluMu.Lock()
	defer kuruluMu.Unlock()
	kalan := kuruluListe[:0]
	for _, mevcut := range kuruluListe {
		if mevcut.Anahtar != k.Anahtar {
			kalan = append(kalan, mevcut)
		}
	}
	kuruluListe = append(kalan, k)
	return kuruluKaydetLocked()
}

// kuruluKaldir: kaydi siler. Dosyalari silmek ayri adimdir.
func kuruluKaldir(anahtar string) error {
	kuruluMu.Lock()
	defer kuruluMu.Unlock()
	kalan := kuruluListe[:0]
	bulundu := false
	for _, mevcut := range kuruluListe {
		if mevcut.Anahtar == anahtar {
			bulundu = true
			continue
		}
		kalan = append(kalan, mevcut)
	}
	if !bulundu {
		return errKuruluYok
	}
	kuruluListe = kalan
	return kuruluKaydetLocked()
}

// kuruluEtkinMi: kurulu ve etkin mi? Kurulu degilse false.
func kuruluEtkinMi(anahtar string) bool {
	kuruluMu.Lock()
	defer kuruluMu.Unlock()
	for _, k := range kuruluListe {
		if k.Anahtar == anahtar {
			return k.Etkin
		}
	}
	return false
}

// kuruluEtkinAyarla: etkinlestirir/devre disi birakir. Devre disi birakmada site yetkileri de duser.
func kuruluEtkinAyarla(anahtar string, etkin bool) error {
	kuruluMu.Lock()
	bulundu := false
	for i := range kuruluListe {
		if kuruluListe[i].Anahtar == anahtar {
			kuruluListe[i].Etkin = etkin
			bulundu = true
		}
	}
	if !bulundu {
		kuruluMu.Unlock()
		return errKuruluYok
	}
	err := kuruluKaydetLocked()
	kuruluMu.Unlock()
	if err != nil {
		return err
	}
	if !etkin {
		// Kilit disinda: yetki modulu kendi kilidini alir.
		return yetkiGeriAl(anahtar, "")
	}
	return nil
}

// kuruluAcilistaAyarla: acilis tercihini kaydeder. Yalnizca kullanici onayiyla cagrilir.
func kuruluAcilistaAyarla(anahtar string, acilista bool) error {
	kuruluMu.Lock()
	defer kuruluMu.Unlock()
	for i := range kuruluListe {
		if kuruluListe[i].Anahtar == anahtar {
			kuruluListe[i].Acilista = acilista
			return kuruluKaydetLocked()
		}
	}
	return errKuruluYok
}

// kuruluVarMi: kayit var mi (etkin olsun olmasin).
func kuruluVarMi(anahtar string) bool {
	kuruluMu.Lock()
	defer kuruluMu.Unlock()
	for _, k := range kuruluListe {
		if k.Anahtar == anahtar {
			return true
		}
	}
	return false
}

// kuruluSurum: kurulu surum ve var mi bilgisi.
func kuruluSurum(anahtar string) (string, bool) {
	kuruluMu.Lock()
	defer kuruluMu.Unlock()
	for _, k := range kuruluListe {
		if k.Anahtar == anahtar {
			return k.Surum, true
		}
	}
	return "", false
}
