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.
// Her istegin sonucu hesabin izin gecmisine yazilir.

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

var izinEtiketleri = map[string]struct {
	baslik   string
	aciklama string
}{
	"everythingAra": {
		baslik:   "fikoyt.com Everything aramasi 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, "yalnızca POST", http.StatusMethodNotAllowed)
		return
	}
	var istek izinIsteIstegi
	if err := json.NewDecoder(http.MaxBytesReader(w, r.Body, 1024)).Decode(&istek); err != nil {
		http.Error(w, "geçersiz istek", http.StatusBadRequest)
		return
	}
	p := profilDe(r)
	ozet := tokenOzeti(r.Header.Get("X-Bridge-Token"))
	site := siteAdiOzetten(p, ozet)
	// Paket anahtari (ornek: everything) yetki anahtarina cevrilir (everythingAra); tek kaynak yetki.go.
	istek.Anahtar = yetkiAnahtari(istek.Anahtar)
	etiket, ok := izinEtiketleri[istek.Anahtar]
	if !ok && kuruluVarMiProfil(p, istek.Anahtar) {
		etiket.baslik = "fikoyt.com " + istek.Anahtar + " eklentisini kullanmak istiyor"
		etiket.aciklama = "Eklenti bu bilgisayarda çalışır. Yetki 24 saat sonra kendiliğinden düşer; istediğiniz zaman Ayarlar'dan kapatabilirsiniz."
		ok = true
	}
	if !ok {
		http.Error(w, "bilinmeyen izin", http.StatusBadRequest)
		return
	}

	kaydet := func(sonuc string) {
		izinGecmisiEkle(p, izinGecmisKaydi{Tur: "site", Anahtar: istek.Anahtar, Site: site, Sonuc: sonuc})
	}

	izin, err := onayBekle(hesapBaslik(p, etiket.baslik), etiket.aciklama)
	if errors.Is(err, errMesgul) {
		kaydet("mesgul")
		yazJSON(w, http.StatusTooManyRequests, map[string]any{"hata": "başka bir onay bekleniyor"})
		return
	}
	if err != nil {
		kaydet("hata")
		olayLog("izin onay ekranı açılamadı: %v", err)
		http.Error(w, "onay ekranı açılamadı", http.StatusInternalServerError)
		return
	}
	if !izin {
		kaydet("reddedildi")
		yazJSON(w, http.StatusForbidden, map[string]any{"hata": "kullanıcı izin vermedi"})
		return
	}

	y := izinOkuProfil(p)
	y.Ayarla(istek.Anahtar, true)
	if err := yetkiVerProfil(p, istek.Anahtar, ozet, siteYetkiSuresi); err != nil {
		kaydet("hata")
		http.Error(w, "kaydedilemedi", http.StatusInternalServerError)
		return
	}
	if err := izinleriKaydetProfil(p, y); err != nil {
		kaydet("hata")
		http.Error(w, "kaydedilemedi", http.StatusInternalServerError)
		return
	}
	kaydet("verildi")
	olayLog("izin verildi: %s (%s)", istek.Anahtar, site)
	yazJSON(w, http.StatusOK, y)
}
