package config

import (
	"encoding/json"
	"log"
	"os"
	"path/filepath"
)

// Config - Ajan konfigurasyonu
type Config struct {
	SunucuURL     string `json:"sunucuUrl"`
	AjanId        string `json:"ajanId"`
	AjanAd        string `json:"ajanAd"`
	TrayAktif     bool   `json:"trayAktif"`
	OtoBaslat     bool   `json:"otoBaslat"`
	LogSeviye     string `json:"logSeviye"`
	YenidenBaglan bool   `json:"yenidenBaglan"`
	BaglantiSure  int    `json:"baglantiSure"` // saniye
}

// VarsayilanConfig - Varsayilan degerler
func VarsayilanConfig() *Config {
	hostname, _ := os.Hostname()
	return &Config{
		SunucuURL:     "https://fikoyt.com:9000",
		AjanId:        hostname,
		AjanAd:        hostname,
		TrayAktif:     true,
		OtoBaslat:     false,
		LogSeviye:     "info",
		YenidenBaglan: true,
		BaglantiSure:  5,
	}
}

// YeniConfig - Config yukle veya olustur
func YeniConfig() *Config {
	cfg := VarsayilanConfig()

	// Calisma dizinini logla
	cwd, _ := os.Getwd()
	log.Printf("Calisma dizini: %s", cwd)

	// Config dosyasini ara
	configYollari := []string{
		"config.json",
		filepath.Join(cwd, "config.json"),
		filepath.Join(cwd, "..", "config.json"),
		filepath.Join(os.Getenv("APPDATA"), "FikoYT-Ajan", "config.json"),
	}

	configBulundu := false
	for _, yol := range configYollari {
		log.Printf("Config araniyor: %s (var: %v)", yol, dosyaVar(yol))
		if dosyaVar(yol) {
			if err := cfg.DosyadanYukle(yol); err != nil {
				log.Printf("Config yukleme hatasi (%s): %v", yol, err)
			} else {
				log.Printf("Config yuklendi: %s", yol)
				configBulundu = true
				break
			}
		}
	}

	if !configBulundu {
		log.Printf("Config dosyasi bulunamadi, varsayilan degerler kullaniliyor: %s", cfg.SunucuURL)
	}

	// Ortam degiskenlerinden oku (oncelikli)
	if url := os.Getenv("FIKOYT_SUNUCU_URL"); url != "" {
		cfg.SunucuURL = url
	}
	if id := os.Getenv("FIKOYT_AJAN_ID"); id != "" {
		cfg.AjanId = id
	}
	if ad := os.Getenv("FIKOYT_AJAN_AD"); ad != "" {
		cfg.AjanAd = ad
	}

	return cfg
}

// DosyadanYukle - Config dosyasindan yukle
func (c *Config) DosyadanYukle(yol string) error {
	data, err := os.ReadFile(yol)
	if err != nil {
		return err
	}
	return json.Unmarshal(data, c)
}

// DosyayaKaydet - Config dosyasina kaydet
func (c *Config) DosyayaKaydet(yol string) error {
	data, err := json.MarshalIndent(c, "", "  ")
	if err != nil {
		return err
	}

	// Klasoru olustur
	dir := filepath.Dir(yol)
	if err := os.MkdirAll(dir, 0755); err != nil {
		return err
	}

	return os.WriteFile(yol, data, 0644)
}

func dosyaVar(yol string) bool {
	_, err := os.Stat(yol)
	return err == nil
}
