package main

// Yerel ayar arayuzu:
//   /ayarlar                                  -> hesap kartlari
//   /ayarlar/hesap/<anahtar>                  -> secili hesabin sekmeli ayarlari
//   /ayarlar/hesap/<anahtar>/eklenti/<ad>     -> eklentinin kendi sayfasi
// Etkin olmayan hesap yalnizca "Bu hesabi kullan" icin gosterilir.
// Degisiklik uclari (izin, eslesme, guncelleme) mevcut korumalari kullanir (CSRF + yerel istek).
// Gorunum ortak tema dosyasindadir (arayuz_tema.go).

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

const ayarlarBetik = `
function csrf(){return document.querySelector('meta[name=csrf]').content}
function bildir(m){var b=document.getElementById('bildirim');b.textContent=m;b.classList.add('acik');setTimeout(function(){b.classList.remove('acik')},2600)}
function gonder(url,govde,sonra){
  fetch(url,{method:'POST',headers:{'Content-Type':'application/json','X-Csrf-Token':csrf()},body:JSON.stringify(govde)})
    .then(function(r){if(!r.ok)return r.text().then(function(t){throw new Error(t)});return r})
    .then(function(){if(sonra)sonra();else bildir('Kaydedildi.')})
    .catch(function(e){bildir('Hata: '+(e.message||'işlem başarısız'))});
}
document.addEventListener('click',function(e){
  var s=e.target.closest('[data-sekme]');
  if(s){
    document.querySelectorAll('[data-sekme]').forEach(function(x){x.classList.toggle('acik',x===s)});
    document.querySelectorAll('.sekme').forEach(function(x){x.classList.toggle('acik',x.id===s.dataset.sekme)});
    return;
  }
  var b=e.target.closest('[data-post]');
  if(b){
    var govde=JSON.parse(b.dataset.govde||'{}');
    var yenile=b.dataset.yenile==='1';
    if(b.dataset.onay&&!confirm(b.dataset.onay))return;
    if(b.dataset.veriSil){var k=document.getElementById('verisil');govde.verisiniSil=!!(k&&k.checked)}
    gonder(b.dataset.post,govde,yenile?function(){location.reload()}:null);
  }
});
document.addEventListener('change',function(e){
  var t=e.target;
  if(t.dataset.izin){gonder('/ayarlar/izin',{profil:document.querySelector('meta[name=hesap]').content,anahtar:t.dataset.izin,deger:t.checked},null);return}
  if(t.dataset.otomatik!==undefined){gonder('/ayarlar/guncelleme',{otomatik:t.checked},null)}
});
`

// ayarlarAnaHandler: GET /ayarlar - hesap kartlari.
func ayarlarAnaHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodGet {
		http.Error(w, "yalnızca GET", http.StatusMethodNotAllowed)
		return
	}
	if !yerelIstek(w, r) {
		return
	}
	if !herhangiOturumVar() {
		http.Redirect(w, r, "/giris", http.StatusSeeOther)
		return
	}
	liste, err := profilListesi()
	if err != nil {
		http.Error(w, "hesaplar okunamadı", http.StatusInternalServerError)
		return
	}
	yaz(w, anaSayfaHTML(liste, csrfToken))
}

// ayarlarHesapHandler: GET /ayarlar/hesap/<anahtar> ve /ayarlar/hesap/<anahtar>/eklenti/<ad>
func ayarlarHesapHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodGet {
		http.Error(w, "yalnızca GET", http.StatusMethodNotAllowed)
		return
	}
	if !yerelIstek(w, r) {
		return
	}
	if !herhangiOturumVar() {
		http.Redirect(w, r, "/giris", http.StatusSeeOther)
		return
	}
	yol := strings.TrimPrefix(r.URL.Path, "/ayarlar/hesap/")
	if strings.HasSuffix(yol, "/izinler") {
		izinYonetimSayfasiYaz(w, r, strings.TrimSuffix(yol, "/izinler"))
		return
	}
	anahtar, eklentiAd, eklentiVar := strings.Cut(yol, "/eklenti/")
	if !profilAnahtarDesen.MatchString(anahtar) {
		http.NotFound(w, r)
		return
	}
	liste, err := profilListesi()
	if err != nil {
		http.Error(w, "hesaplar okunamadı", http.StatusInternalServerError)
		return
	}
	var secili *profilBilgi
	for i := range liste {
		if liste[i].Anahtar == anahtar {
			secili = &liste[i]
			break
		}
	}
	if secili == nil {
		http.NotFound(w, r)
		return
	}
	if eklentiVar {
		eklentiSayfasiYaz(w, r, *secili, eklentiAd)
		return
	}
	// Her etkin hesap kendi verisiyle tam olarak yonetilir; aktif hesap kavrami yok.
	etkin := etkinMi(anahtar)
	var y Izinler
	var es []eslesme
	var ekl []kuruluEklenti
	otomatik := false
	if etkin {
		y = izinOkuProfil(anahtar)
		es = eslesmeleriOkuProfil(anahtar)
		ekl = kuruluListesiKopya(anahtar)
		otomatik = guncellemeAyarOku().Otomatik
	}
	yaz(w, hesapSayfaHTML(*secili, etkin, etkin, y, es, ekl, otomatik, csrfToken))
}

// eklentiSayfasiYaz: bir eklentinin kendi sayfasi. Yalnizca etkin hesabin eklentileri gosterilir.
func eklentiSayfasiYaz(w http.ResponseWriter, r *http.Request, p profilBilgi, ad string) {
	if !etkinMi(p.Anahtar) {
		http.Redirect(w, r, "/ayarlar/hesap/"+p.Anahtar, http.StatusSeeOther)
		return
	}
	for _, e := range kuruluListesiKopya(p.Anahtar) {
		if e.Anahtar == ad {
			yaz(w, eklentiSayfaHTML(p, e, csrfToken))
			return
		}
	}
	http.NotFound(w, r)
}

// kuruluListesiKopya: verilen profilin kurulu eklentilerinin kopyasi (kilit altinda okunur).
func kuruluListesiKopya(anahtar string) []kuruluEklenti {
	kuruluMu.Lock()
	defer kuruluMu.Unlock()
	return append([]kuruluEklenti(nil), kuruluListeAl(anahtar)...)
}

func yaz(w http.ResponseWriter, s string) {
	w.Header().Set("Content-Type", "text/html; charset=utf-8")
	w.Header().Set("Cache-Control", "no-store")
	w.Write([]byte(s))
}

func anaSayfaHTML(liste []profilBilgi, token string) string {
	var b strings.Builder
	b.WriteString(`<h1 class="sayfa-baslik">Hesaplar</h1><p class="aciklama">Bu bilgisayara giriş yapmış fikoyt.com hesapları. Bir hesaba tıklayarak izinlerini, eşleşmelerini ve eklentilerini yönetin.</p>`)
	b.WriteString(`<div class="izgara">`)
	for _, p := range liste {
		durum := "Bağlı"
		if etkinMi(p.Anahtar) {
			durum = "Etkin"
		}
		b.WriteString(fmt.Sprintf(`<a class="kare" href="/ayarlar/hesap/%s"><div class="avatar">%s</div><div class="ad">%s</div><span class="etiket">%s</span></a>`,
			html.EscapeString(p.Anahtar), html.EscapeString(bas(p.KullaniciAdi)), html.EscapeString(p.KullaniciAdi), durum))
	}
	b.WriteString(`<a class="kare ekle" href="/giris"><div class="avatar">+</div><div class="ad">Yeni hesap</div><span class="etiket">Giriş yap</span></a>`)
	b.WriteString(`</div>`)
	return sayfaKabugu("Hesaplar", b.String(), token, "")
}

func hesapSayfaHTML(p profilBilgi, aktif, etkin bool, y Izinler, es []eslesme, ekl []kuruluEklenti, otomatik bool, token string) string {
	var b strings.Builder
	b.WriteString(fmt.Sprintf(`<section class="kart"><div class="ust-satir"><div class="hesap-bas"><div class="avatar">%s</div><div><div class="sayfa-baslik">%s</div><div class="alt">%s</div></div></div></div></section>`,
		html.EscapeString(bas(p.KullaniciAdi)), html.EscapeString(p.KullaniciAdi), durumMetni(aktif)))
	b.WriteString(`<meta name="hesap" content="` + html.EscapeString(p.Anahtar) + `">`)
	if !aktif {
		b.WriteString(`<section class="kart"><h2 class="kart-baslik">Bu hesap etkin değil</h2><p class="aciklama">İzinleri, eşleşmeleri ve eklentileri görmek için önce bu hesabı kullanın.</p>`)
		b.WriteString(fmt.Sprintf(`<button class="dugme birincil" data-post="/profiller/etkinle" data-govde='{"anahtar":"%s"}' data-yenile="1">Bu hesabı kullan</button></section>`,
			html.EscapeString(p.Anahtar)))
		return sayfaKabugu(p.KullaniciAdi, b.String(), token, "/ayarlar")
	}

	b.WriteString(fmt.Sprintf(`<div class="dugmeler" style="margin:0 0 12px"><a class="dugme" href="/ayarlar/hesap/%s/izinler">İzin yönetimi ve geçmişi</a></div>`, html.EscapeString(p.Anahtar)))
	b.WriteString(`<nav class="sekmeler">
<button class="acik" data-sekme="sek-izin">İzinler</button>
<button data-sekme="sek-eklenti">Eklentiler</button>
<button data-sekme="sek-esle">Eşleşmeler</button>
<button data-sekme="sek-guncelle">Güncelleme</button>
<button data-sekme="sek-hesap">Hesap</button>
</nav>`)

	b.WriteString(`<div id="sek-izin" class="sekme acik"><section class="kart"><h2 class="kart-baslik">İzinler</h2><p class="aciklama">Eklentilere verdiğiniz izinler yalnızca bu bilgisayarda geçerlidir.</p>`)
	b.WriteString(izinSatiri("everythingAra", "Dosya arama", "Everything eklentisiyle dosya adına göre arama.", y.EverythingAra))
	b.WriteString(izinSatiri("catiaAc", "CATIA açma", "CATIA dosyalarını açma isteği.", y.CatiaAc))
	b.WriteString(izinSatiri("usb", "USB bağlantısı", "USB aygıtlarına erişim.", y.UsbBaglanti))
	b.WriteString(`</section></div>`)

	b.WriteString(`<div id="sek-eklenti" class="sekme"><section class="kart"><h2 class="kart-baslik">Eklentiler</h2><p class="aciklama">Bu hesapta kurulu eklentiler. Ayrıntısı için tıklayın.</p>`)
	if len(ekl) == 0 {
		b.WriteString(`<div class="bos">Kurulu eklenti yok.</div>`)
	}
	for _, e := range ekl {
		etiket := `<span class="etiket">Devre dışı</span>`
		if e.Etkin {
			etiket = `<span class="etiket yesil">Etkin</span>`
		}
		b.WriteString(fmt.Sprintf(`<a class="satir satir-link" href="/ayarlar/hesap/%s/eklenti/%s"><div class="bilgi"><div class="baslik">%s</div><div class="alt">Sürüm %s</div></div>%s</a>`,
			html.EscapeString(p.Anahtar), html.EscapeString(e.Anahtar), html.EscapeString(e.Anahtar), html.EscapeString(e.Surum), etiket))
	}
	b.WriteString(`</section></div>`)

	b.WriteString(`<div id="sek-esle" class="sekme"><section class="kart"><h2 class="kart-baslik">Eşleşmeler</h2><p class="aciklama">Bu bilgisayarla eşleşen siteler. Kaldırılan site artık erişemez.</p>`)
	if len(es) == 0 {
		b.WriteString(`<div class="bos">Henüz eşleşmiş site yok.</div>`)
	}
	for _, e := range es {
		tarih := e.Tarih
		if t, err := time.Parse(time.RFC3339, e.Tarih); err == nil {
			tarih = t.Format("02.01.2006 15:04")
		}
		b.WriteString(fmt.Sprintf(`<div class="satir"><div class="bilgi"><div class="baslik">%s</div><div class="alt">%s</div></div><button class="dugme tehlike" data-post="/ayarlar/eslesme-kaldir" data-govde='{"profil":"%s","ozet":"%s"}' data-yenile="1" data-onay="Bu eşleşme kaldırılsın mı?">Kaldır</button></div>`,
			html.EscapeString(e.Site), html.EscapeString(tarih), html.EscapeString(p.Anahtar), html.EscapeString(e.TokenOzeti)))
	}
	b.WriteString(`</section></div>`)

	secili := ""
	if otomatik {
		secili = " checked"
	}
	b.WriteString(`<div id="sek-guncelle" class="sekme"><section class="kart"><h2 class="kart-baslik">Güncelleme</h2><p class="aciklama">Açık olduğunda yeni köprü sürümleri onay sormadan kurulur ve köprü yeniden başlar.</p>`)
	b.WriteString(`<div class="satir"><div class="bilgi"><div class="baslik">Yeni sürümleri otomatik kur</div><div class="alt">Kapalıyken her güncellemede onay ekranı açılır.</div></div><label class="anahtar"><input type="checkbox" data-otomatik="1"` + secili + `><span></span></label></div>`)
	b.WriteString(`</section></div>`)

	b.WriteString(fmt.Sprintf(`<div id="sek-hesap" class="sekme"><section class="kart"><h2 class="kart-baslik">Hesap</h2><p class="aciklama">Hesabı çıkardığınızda bu bilgisayardaki oturum kapanır.</p>
<label class="kutu"><input type="checkbox" id="verisil"> Hesabın verisini de sil (izinler, eşleşmeler, eklenti ayarları)</label>
<div class="dugmeler"><button class="dugme tehlike" data-post="/profiller/cikar" data-govde='{"anahtar":"%s"}' data-veri-sil="1" data-yenile="1" data-onay="Bu hesap çıkarılsın mı?">Hesabı çıkar</button></div></section></div>`,
		html.EscapeString(p.Anahtar)))

	return sayfaKabugu(p.KullaniciAdi, b.String(), token, "/ayarlar")
}

// eklentiSayfaHTML: tek eklentinin ozet sayfasi (etkin hesap).
func eklentiSayfaHTML(p profilBilgi, e kuruluEklenti, token string) string {
	var b strings.Builder
	durum := `<span class="etiket">Devre dışı</span>`
	if e.Etkin {
		durum = `<span class="etiket yesil">Etkin</span>`
	}
	acilis := "Kapalı"
	if e.Acilista {
		acilis = "Açık"
	}
	b.WriteString(fmt.Sprintf(`<h1 class="sayfa-baslik">%s</h1><p class="aciklama">%s hesabında kurulu eklenti.</p>
<section class="kart">
<div class="satir"><div class="bilgi"><div class="baslik">Durum</div><div class="alt">Eklentinin etkin olması için bu bilgisayarda izin verilmiş olması gerekir.</div></div>%s</div>
<div class="satir"><div class="bilgi"><div class="baslik">Sürüm</div></div><span class="etiket">%s</span></div>
<div class="satir"><div class="bilgi"><div class="baslik">Bilgisayar açılışında başlat</div><div class="alt">%s</div></div></div>
</section>`,
		html.EscapeString(e.Anahtar), html.EscapeString(p.KullaniciAdi), durum, html.EscapeString(e.Surum), acilis))
	anahtar := html.EscapeString(e.Anahtar)
	islem := `<button class="dugme birincil" data-post="/eklenti/yerel" data-govde='{"profil":"` + p.Anahtar + `","anahtar":"` + anahtar + `","islem":"etkinlestir"}' data-yenile="1">Etkinleştir</button>`
	if e.Etkin {
		islem = `<button class="dugme" data-post="/eklenti/yerel" data-govde='{"profil":"` + p.Anahtar + `","anahtar":"` + anahtar + `","islem":"devre-disi"}' data-yenile="1">Devre dışı bırak</button>`
	}
	kaldir := `<button class="dugme tehlike" data-post="/eklenti/yerel" data-govde='{"profil":"` + p.Anahtar + `","anahtar":"` + anahtar + `","islem":"kaldir"}' data-yenile="1" data-onay="Eklenti kaldırılsın mı? Dosyalar silinir ve site yetkileri kaldırılır.">Kaldır</button>`
	b.WriteString(eklentiAyarFormuHTML(p, e))
	b.WriteString(`<section class="kart"><h2 class="kart-baslik">İşlemler</h2><p class="aciklama">Devre dışı bırakılan eklentinin site yetkileri düşer. Kaldırma işlemi bilgisayarda ayrıca onay ister.</p><div class="dugmeler">` + islem + kaldir + `</div></section>`)
	return sayfaKabugu(e.Anahtar, b.String(), token, "/ayarlar/hesap/"+p.Anahtar)
}

func izinSatiri(anahtar, baslik, alt string, acik bool) string {
	secili := ""
	if acik {
		secili = " checked"
	}
	return fmt.Sprintf(`<div class="satir"><div class="bilgi"><div class="baslik">%s</div><div class="alt">%s</div></div><label class="anahtar"><input type="checkbox" data-izin="%s"%s><span></span></label></div>`,
		html.EscapeString(baslik), html.EscapeString(alt), anahtar, secili)
}

func durumMetni(aktif bool) string {
	if aktif {
		return "Etkin hesap"
	}
	return "Giriş yapılmış, etkinleştirilebilir"
}

func bas(ad string) string {
	for _, r := range ad {
		return strings.ToUpper(string(r))
	}
	return "?"
}
