package config

import (
	"encoding/json"
	"os"
	"path/filepath"

	"github.com/chenasraf/stimvisor/common"
	"github.com/chenasraf/stimvisor/logger"
)

type Config struct {
	WindowWidth  int `json:"windowWidth"`
	WindowHeight int `json:"windowHeight"`
}

var config *Config

func (c *Config) Save() {
	configDir := common.GetConfigDir()
	configPath := GetConfigPath()

	os.MkdirAll(configDir, os.ModePerm)
	f, err := os.Create(configPath)
	if err != nil {
		logger.FatalErr(err)
		panic(err)
	}
	defer f.Close()
	json, err := json.Marshal(c)
	if err != nil {
		logger.FatalErr(err)
		panic(err)
	}
	f.WriteString(string(json))
	config = c
	logger.Info("Config saved in: %s", configPath)
}

func NewConfig() *Config {
	return &Config{
		WindowWidth:  1024,
		WindowHeight: 768,
	}
}

func GetConfigPath() string {
	configDir := common.GetConfigDir()
	configPath := filepath.Join(configDir, "config.json")
	return configPath
}

func GetConfig() Config {
	if config != nil {
		return *config
	}
	configPath := GetConfigPath()
	if _, err := os.Stat(configPath); os.IsNotExist(err) {
		logger.Warn("Config file not found: %s", configPath)
		logger.Info("Creating new config file")
		config := NewConfig()
		config.Save()
		return *config
	}

	config := NewConfig()
	configFile, err := os.ReadFile(configPath)

	if err != nil {
		logger.FatalErr(err)
		panic(err)
	}

	err = json.Unmarshal([]byte(configFile), config)
	if err != nil {
		logger.FatalErr(err)
		panic(err)
	}
	logger.Info("Config loaded from: %s", configPath)

	return *config
}

func (c *Config) GetWindowSize() (int, int) {
	config := GetConfig()
	return config.WindowWidth, config.WindowHeight
}
