package main

// Secenekli onay: kullanici onay ekraninda "Bu sefer", "1 saat" ya da "Kalici" secerek
// site icin sureli bir yetki verebilir. Reddetme ya da zaman asimi izin vermez.
// Kalici izin, sitenin yetki listesinde saklanir ve bu bilgisayardan geri alinabilir.
// Onay ekrani, neyin yapilacagini (ayrinti) ve iznin kapsamini (kapsam) gosterir.
// Guncelleme onayinda ise "Her zaman otomatik guncelle" secenegi vardir.

import (
	"html"
	"time"
)

const (
	sureBuSefer  = "bu-sefer"
	sureSaat     = "saat"
	sureGun      = "gun"
	sureKalici   = "kalici"
	sureOtomatik = "otomatik"
	kaliciSure   = 100 * 365 * 24 * time.Hour
)

// onayBekleSecenekli: secenekli onay ekrani acar; izin, secilen sure ve hata dondurur.
func onayBekleSecenekli(bilgi onayBilgi) (bool, string, error) {
	id, err := rastgeleHex(16)
	if err != nil {
		return false, "", err
	}
	bilgi.secenekli = true
	eslesMu.Lock()
	if bekleyenID != "" {
		eslesMu.Unlock()
		bekleyenOnayiYenidenAc()
		return false, "", errMesgul
	}
	ch := make(chan bool, 1)
	bekleyenID = id
	bekleyenCh[id] = ch
	bekleyenBi[id] = bilgi
	sonOnayAcilis = time.Now()
	eslesMu.Unlock()
	defer onayBitir(id)

	if err := tarayiciAc("http://127.0.0.1:7878/onay/" + id); err != nil {
		return false, "", err
	}
	select {
	case izin := <-ch:
		eslesMu.Lock()
		sure := bekleyenSure[id]
		delete(bekleyenSure, id)
		eslesMu.Unlock()
		if !izin {
			return false, "", nil
		}
		if sure == "" {
			sure = sureBuSefer
		}
		return true, sure, nil
	case <-time.After(60 * time.Second):
		return false, "", nil
	}
}

// onaySecenekliSayfa: secenekli onay ekrani. Her secenegin ne yaptigi ayrica anlatilir.
func onaySecenekliSayfa(id string, aktif bool, bilgi onayBilgi) string {
	var dugmeler string
	if bilgi.guncelleme {
		dugmeler = `<div class="dugmeler dikey">
<button class="onay" onclick="karar(true,'` + sureBuSefer + `')">Şimdi güncelle<small>Bu güncellemeyi hemen kurar ve köprü yeniden başlar.</small></button>
<button class="onay" onclick="karar(true,'` + sureOtomatik + `')">Her zaman otomatik güncelle<small>Sonraki güncellemeler sorulmadan kurulur.</small></button>
<button onclick="karar(false,'')">Daha sonra<small>Bir sonraki kontrolde yeniden sorulur.</small></button>
</div>`
	} else {
		dugmeler = `<div class="dugmeler dikey">
<button class="onay" onclick="karar(true,'` + sureSaat + `')">1 saat izin ver<small>60 dakika geçerli, sonra yeniden sorulur.</small></button>
<button class="onay" onclick="karar(true,'` + sureGun + `')">1 gün izin ver<small>24 saat geçerli, sonra yeniden sorulur.</small></button>
<button class="onay" onclick="karar(true,'` + sureKalici + `')">Kalıcı izin ver<small>Bu site için kalıcı izin verir. Ayarlardan geri alınabilir.</small></button>
<div class="ozel"><label>Bu tarihe kadar<input type="datetime-local" id="ozelBitis"></label><button class="onay" onclick="ozelIzin()">Bu tarihe kadar izin ver</button></div>
<button onclick="karar(true,'` + sureBuSefer + `')">Bu sefer izin ver<small>Yalnızca bu işlem için izin verir.</small></button>
<button onclick="karar(false,'')">Reddet<small>Hiçbir şey yapılmaz.</small></button>
</div>`
	}
	govde := `<p>` + html.EscapeString(bilgi.aciklama) + `</p>` + onayAyrintiHTML(bilgi) + dugmeler
	if !aktif {
		govde = `<p>Bu istek artık geçerli değil (süresi dolmuş ya da yanıtlanmış).</p>`
	}
	return onaySayfasiTemel(id, bilgi.baslik, govde)
}

// onayAyrintiHTML: onay ekranindaki madde listesi ve kapsam kutusunu uretir.
func onayAyrintiHTML(bilgi onayBilgi) string {
	s := ""
	if len(bilgi.ayrinti) > 0 {
		s += `<ul class="ayrinti">`
		for _, a := range bilgi.ayrinti {
			s += `<li>` + html.EscapeString(a) + `</li>`
		}
		s += `</ul>`
	}
	if bilgi.kapsam != "" {
		s += `<p class="kapsam">` + html.EscapeString(bilgi.kapsam) + `</p>`
	}
	return s
}
