package main

import (
	"encoding/json"
	"net/http"
	"os"
	"path/filepath"
)

// Web arayuzunun tek izinli kokeni. Baska her Origin reddedilir.
const izinliKoken = "https://fikoyt.com"

// hostVeOriginKontrol: Host basligini loopback ile sinirlar (DNS yeniden baglama)
// ve yalnizca izinli Origin'e CORS yanit verir.
func hostVeOriginKontrol(h http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		if r.Host != dinleAdres && r.Host != "localhost:7878" {
			http.Error(w, "gecersiz host", http.StatusForbidden)
			return
		}
		origin := r.Header.Get("Origin")
		if origin != "" && origin != izinliKoken && origin != "http://"+dinleAdres && origin != "http://localhost:7878" {
			http.Error(w, "gecersiz origin", http.StatusForbidden)
			return
		}
		if origin == izinliKoken {
			w.Header().Set("Access-Control-Allow-Origin", origin)
			w.Header().Set("Vary", "Origin")
			w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
			w.Header().Set("Access-Control-Allow-Headers", "X-Bridge-Token, Content-Type")
		}
		if r.Method == http.MethodOptions {
			w.WriteHeader(http.StatusNoContent)
			return
		}
		h.ServeHTTP(w, r)
	})
}

// korumali: her korunan uc icin X-Bridge-Token zorunlu. Token bir profilin onayli eslesmesine aittir.
// Istek, tokenin sahibi profil etkin hesaplar kumesindeyse kabul edilir (coklu hesap); aktif profil
// olmasi gerekmez. Istegin profili profilDe(r) ile belirlenir; korunan isleyiciler bunu kullanmalidir.
// Profil secilmemisken (tek hesap donemi) kok klasordeki eslesmeler kullanilir.
func korumali(h http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		token := r.Header.Get("X-Bridge-Token")
		if sahip, ok := tokenProfili(token); ok {
			if !etkinMi(sahip) {
				http.Error(w, "bu hesap etkin değil; önce hesabı etkinleştirin", http.StatusConflict)
				return
			}
			h(w, profilBaglam(r, sahip))
			return
		}
		http.Error(w, "yetkisiz", http.StatusUnauthorized)
	}
}
func veriKlasoru() (string, error) {
	dir, err := os.UserConfigDir()
	if err != nil {
		return "", err
	}
	yol := filepath.Join(dir, "FikoYT")
	return yol, os.MkdirAll(yol, 0o700)
}

func yazJSON(w http.ResponseWriter, kod int, v any) {
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
	w.Header().Set("Cache-Control", "no-store")
	w.WriteHeader(kod)
	json.NewEncoder(w).Encode(v)
}
