package main

import (
	"html"
	"net/http"
	"strings"
)

// ayarlarIzinSayfaHandler: GET /ayarlar/izinler/<anahtar> - hesabin izinleri ayri sayfada.
func ayarlarIzinSayfaHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodGet {
		http.Error(w, "yalnizca GET", http.StatusMethodNotAllowed)
		return
	}
	if !yerelIstek(w, r) {
		return
	}
	if !herhangiOturumVar() {
		http.Redirect(w, r, "/giris", http.StatusSeeOther)
		return
	}
	anahtar := strings.TrimPrefix(r.URL.Path, "/ayarlar/izinler/")
	if !profilAnahtarDesen.MatchString(anahtar) {
		http.NotFound(w, r)
		return
	}
	liste, err := profilListesi()
	if err != nil {
		http.Error(w, "hesaplar okunamadi", http.StatusInternalServerError)
		return
	}
	for i := range liste {
		if liste[i].Anahtar == anahtar {
			if !etkinMi(anahtar) {
				http.Redirect(w, r, "/ayarlar/hesap/"+anahtar, http.StatusSeeOther)
				return
			}
			yaz(w, izinSayfaHTML(liste[i], csrfToken))
			return
		}
	}
	http.NotFound(w, r)
}

// izinBaglantiKarti: hesap sayfasindaki izin rotasina giden kart.
func izinBaglantiKarti(anahtar string) string {
	return `<section class="kart"><h2 class="kart-baslik">İzinler</h2><p class="aciklama">Bu hesabın izinleri, istek geçmişi ve iptal işlemleri ayrı bir sayfada.</p><a class="dugme birincil" href="/ayarlar/izinler/` + html.EscapeString(anahtar) + `">İzinleri yönet</a></section>`
}

// izinSayfaHTML: hesabin genel izinleri, kurulu ama izinsiz eklentiler ve istek yonetimi.
func izinSayfaHTML(p profilBilgi, token string) string {
	y := izinOkuProfil(p.Anahtar)
	var b strings.Builder
	b.WriteString(`<meta name="hesap" content="` + html.EscapeString(p.Anahtar) + `">`)
	b.WriteString(`<h1 class="sayfa-baslik">İzinler</h1><p class="aciklama">` + html.EscapeString(p.KullaniciAdi) + ` hesabının bu bilgisayardaki izinleri. Yalnızca bu bilgisayarda geçerlidir.</p>`)
	b.WriteString(`<section class="kart"><h2 class="kart-baslik">Genel izinler</h2>`)
	acikVar := false
	for _, k := range yerelIzinAnahtarlari(y) {
		if y.Acik(k) {
			acikVar = true
			b.WriteString(izinSatiri(k, izinKisaAdi(k), "Eklenti izni. Kapatırsanız bu eklenti bu hesapta çalışmaz.", true))
		}
	}
	if !acikVar {
		b.WriteString(`<div class="bos">Açık izin yok.</div>`)
	}
	for _, e := range kuruluListesiKopya(p.Anahtar) {
		if !y.Acik(yetkiAnahtari(e.Anahtar)) {
			b.WriteString(`<p class="aciklama">Kurulu, henüz izin verilmemiş: <strong>` + html.EscapeString(e.Anahtar) + `</strong>. Eklenti izin istediğinde onay penceresi açılır.</p>`)
		}
	}
	b.WriteString(`</section>`)
	b.WriteString(izinYonetimIcerik(p))
	return sayfaKabugu("İzinler", b.String(), token, "/ayarlar/hesap/"+p.Anahtar)
}

// eklentiIzinBolumu: bir eklentinin izinleri (imzali tanim varsa onun metniyle), eklenti sayfasinda ayarlanir.
func eklentiIzinBolumu(p profilBilgi, e kuruluEklenti) string {
	y := izinOkuProfil(p.Anahtar)

	tanimlar := e.Izinler
	if len(tanimlar) == 0 {
		tanimlar = []izinTanimi{{Anahtar: yetkiAnahtari(e.Anahtar), Baslik: "Eklenti izni", Aciklama: "Bu eklentinin bu bilgisayarda kullanabileceği izin."}}
	}
	var s strings.Builder
	s.WriteString(`<meta name="hesap" content="` + html.EscapeString(p.Anahtar) + `">`)
	s.WriteString(`<section class="kart"><h2 class="kart-baslik">İzinler</h2><p class="aciklama">Bu eklentinin bu bilgisayarda kullanabileceği izinler. Kapatırsanız eklenti bu izni kullanamaz.</p>`)
	for _, t := range tanimlar {
		s.WriteString(izinSatiri(t.Anahtar, t.Baslik, t.Aciklama, y.Acik(t.Anahtar)))
	}
	s.WriteString(acilisSatiri(p, e))
	s.WriteString(`</section>`)
	return s.String()
}

// acilisSatiri: eklentinin acilista baslatma anahtari. Yalnizca manifest izin verdiyse gosterilir;
// her degisiklik bridge tarafinda onay penceresi acar.
func acilisSatiri(p profilBilgi, e kuruluEklenti) string {
	if !e.AcilisIzinli {
		return `<p class="aciklama">Bu eklenti bilgisayar açılışında başlatılamaz.</p>`
	}
	secili := ""
	if e.Acilista {
		secili = " checked"
	}
	return `<div class="satir"><div class="bilgi"><div class="baslik">Bilgisayar açılışında başlat</div><div class="alt">Açıldığında bu eklenti otomatik başlar. Her değişiklikte onay istenir.</div></div><label class="anahtar"><input type="checkbox" data-acilista="` + html.EscapeString(e.Anahtar) + `" data-profil="` + html.EscapeString(p.Anahtar) + `"` + secili + `><span></span></label></div>`
}
