// Package guncelleme — native FikoYT masaüstü uygulaması otomatik güncelleme sunucusu.
// Manifest + paket dosyalarını sunar (istemci: fikatia-local GuncellemeServisi WinHTTP).
// Dosyalar sunucu çalışma dizinindeki guncelleme/ altında tutulur:
//
//	guncelleme/kararli.json     (kanal manifesti — ManifestBilgi şeması)
//	guncelleme/beta.json
//	guncelleme/gece.json
//	guncelleme/paket/0.6.0.zip  (imzalı sürüm paketi — Dalga 2 sha256+Ed25519)
package guncelleme

import (
	"os"
	"path/filepath"
	"strings"

	"github.com/gofiber/fiber/v3"
)

// Geçerli kanallar (whitelist → path traversal + rastgele dosya okuma engeli).
var kanallar = map[string]bool{"kararli": true, "beta": true, "gece": true}

// Ayarla — /guncelleme grubunu app'e bağlar (main.go içinde çağrılır).
func Ayarla(app *fiber.App) {
	g := app.Group("/guncelleme")

	// Manifest: GET /guncelleme/latest.json?kanal=kararli&surum=0.5.0
	// kanal başına guncelleme/<kanal>.json dosyasını döner (yoksa 404).
	g.Get("/latest.json", func(c fiber.Ctx) error {
		kanal := c.Query("kanal", "kararli")
		if !kanallar[kanal] {
			kanal = "kararli"
		}
		veri, err := os.ReadFile(filepath.Join("guncelleme", kanal+".json"))
		if err != nil {
			return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"hata": "manifest bulunamadı"})
		}
		c.Set("Content-Type", "application/json; charset=utf-8")
		c.Set("Cache-Control", "no-cache")
		return c.Send(veri)
	})

	// Paket indirme: GET /guncelleme/paket/<dosya>
	// filepath.Base + ".." kontrolü → yalnız guncelleme/paket/ altındaki dosyalar.
	g.Get("/paket/:dosya", func(c fiber.Ctx) error {
		dosya := filepath.Base(c.Params("dosya"))
		if dosya == "" || dosya == "." || dosya == "/" || strings.Contains(dosya, "..") {
			return c.Status(fiber.StatusBadRequest).SendString("geçersiz dosya adı")
		}
		yol := filepath.Join("guncelleme", "paket", dosya)
		veri, err := os.ReadFile(yol)
		if err != nil {
			return c.Status(fiber.StatusNotFound).SendString("paket bulunamadı")
		}
		c.Set("Content-Type", "application/octet-stream")
		c.Set("Content-Disposition", "attachment; filename=\""+dosya+"\"")
		return c.Send(veri)
	})
}
