package main

// izinIsteHandler: eslesmis fikoyt.com sayfasi bir izin ister (POST /izin-iste, token gerekli).
// Izin, bu bilgisayardaki kullanicinin onay ekraninda "Izin ver" demesiyle acilir.
// Web sayfasi izni tek basina acamaz; reddetme ve geri alma her zaman yereldir.

import (
	"encoding/json"
	"errors"
	"net/http"
)

var izinEtiketleri = map[string]struct {
	baslik   string
	aciklama string
}{
	"everythingAra": {
		baslik:   "fikoyt.com Everything araması iznini istiyor",
		aciklama: "İzin verirseniz fikoyt.com, bu bilgisayardaki dosya adlarını arayabilir. Küçük önizlemeler Windows'un kendi özelliğiyle alınır; dosya içeriğini eklenti kendisi açıp okumaz. İstediğiniz zaman Ayarlar'dan kapatabilirsiniz.",
	},
	"catiaAc": {
		baslik:   "fikoyt.com CATIA erişimi istiyor",
		aciklama: "İzin verirseniz fikoyt.com bu bilgisayardaki CATIA ile bağlantı kurabilir. İstediğiniz zaman Ayarlar'dan kapatabilirsiniz.",
	},
	"usb": {
		baslik:   "fikoyt.com USB eklentisini kullanmak istiyor",
		aciklama: "İzin verirseniz fikoyt.com bu bilgisayardaki USB sürücülerini listeleyebilir ve USB eklentisini çalıştırabilir. Dosya işlemleri ayrıca klasör bazında onaylanır. İstediğiniz zaman Ayarlar'dan kapatabilirsiniz.",
	},
	"dosyaYonetimi": {
		baslik:   "fikoyt.com dosya yöneticisini kullanmak istiyor",
		aciklama: "İzin verirseniz fikoyt.com dosya yöneticisi eklentisini bu bilgisayarda kullanabilir. Hangi klasörlere ve ne kadar süreyle erişileceğini her klasör için bu bilgisayardaki onay penceresinde ayrıca seçersiniz. İstediğiniz zaman Ayarlar'dan kapatabilirsiniz.",
	},
}

type izinIsteIstegi struct {
	Anahtar string `json:"anahtar"`
}

func izinIsteHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodPost {
		http.Error(w, "yalnizca POST", http.StatusMethodNotAllowed)
		return
	}
	var istek izinIsteIstegi
	if err := json.NewDecoder(http.MaxBytesReader(w, r.Body, 1024)).Decode(&istek); err != nil {
		http.Error(w, "gecersiz istek", http.StatusBadRequest)
		return
	}
	// Paket anahtari (ornek: everything) yetki anahtarina cevrilir (everythingAra); tek kaynak yetki.go.
	istek.Anahtar = yetkiAnahtari(istek.Anahtar)
	etiket, ok := izinEtiketleri[istek.Anahtar]
	if !ok && kuruluVarMi(istek.Anahtar) {
		etiket.baslik = "fikoyt.com " + istek.Anahtar + " eklentisini kullanmak istiyor"
		etiket.aciklama = "Eklenti bu bilgisayarda calisir. Yetki 24 saat sonra kendiliginden duser; istediginiz zaman Ayarlar'dan kapatabilirsiniz."
		ok = true
	}
	if !ok {
		http.Error(w, "bilinmeyen izin", http.StatusBadRequest)
		return
	}

	izin, err := onayBekle(etiket.baslik, etiket.aciklama)
	if errors.Is(err, errMesgul) {
		yazJSON(w, http.StatusTooManyRequests, map[string]any{"hata": "baska bir onay bekleniyor"})
		return
	}
	if err != nil {
		olayLog("izin onay ekrani acilamadi: %v", err)
		http.Error(w, "onay ekrani acilamadi", http.StatusInternalServerError)
		return
	}
	if !izin {
		yazJSON(w, http.StatusForbidden, map[string]any{"hata": "kullanici izin vermedi"})
		return
	}

	y := izinOku()
	y.Ayarla(istek.Anahtar, true)
	if err := yetkiVer(istek.Anahtar, tokenOzeti(r.Header.Get("X-Bridge-Token")), siteYetkiSuresi); err != nil {
		http.Error(w, "kaydedilemedi", http.StatusInternalServerError)
		return
	}
	if err := izinleriKaydet(y); err != nil {
		http.Error(w, "kaydedilemedi", http.StatusInternalServerError)
		return
	}
	olayLog("izin verildi: %s", istek.Anahtar)
	yazJSON(w, http.StatusOK, y)
}
