package settings

import (
	"encoding/json"
	"io"
	"log"
	"os"
	"path/filepath"
	"runtime"

	"fyne.io/fyne/v2"
)

type Settings struct {
	Theme       string `json:"theme"`
	LastBoard   string `json:"last_board"`
	AutoRefresh bool   `json:"auto_refresh"`
	ShowFiles   bool   `json:"show_files"`
	CompactMode bool   `json:"compact_mode"`
	PageSize    int    `json:"page_size"`
	Passcode    string `json:"passcode"`
	Key         string `json:"key"`
}

var settingsPath string
var fyneApp fyne.App

func SetApp(app fyne.App) {
	fyneApp = app
}

func Init() error {
	var appDir string

	if runtime.GOOS == "android" || runtime.GOOS == "ios" {
		appDir = filepath.Join(os.TempDir(), "mobilemkch")
		log.Printf("Используем временную директорию для %s: %s", runtime.GOOS, appDir)
	} else {
		homeDir, err := os.UserHomeDir()
		if err != nil {
			return err
		}
		appDir = filepath.Join(homeDir, ".mobilemkch")
		log.Printf("Используем домашнюю директорию: %s", appDir)
	}

	if err := os.MkdirAll(appDir, 0755); err != nil {
		return err
	}

	settingsPath = filepath.Join(appDir, "settings.json")
	log.Printf("Путь к настройкам: %s", settingsPath)
	return nil
}

func Load() (*Settings, error) {
	settings := &Settings{
		Theme:       "dark",
		LastBoard:   "",
		AutoRefresh: true,
		ShowFiles:   true,
		CompactMode: false,
		PageSize:    10,
	}

	if (runtime.GOOS == "android" || runtime.GOOS == "ios") && fyneApp != nil {
		log.Printf("Загружаем настройки через Fyne Storage")
		storage := fyneApp.Storage()

		reader, err := storage.Open("settings.json")
		if err != nil {
			log.Printf("Файл настроек не найден в Fyne Storage, создаем новый")
			return settings, Save(settings)
		}
		defer reader.Close()

		data, err := io.ReadAll(reader)
		if err != nil {
			log.Printf("Ошибка чтения из Fyne Storage: %v", err)
			return nil, err
		}

		if err := json.Unmarshal(data, settings); err != nil {
			log.Printf("Ошибка парсинга настроек из Fyne Storage: %v", err)
			return nil, err
		}

		log.Printf("Настройки загружены из Fyne Storage")
		return settings, nil
	}

	if settingsPath == "" {
		if err := Init(); err != nil {
			return nil, err
		}
	}

	log.Printf("Загружаем настройки из: %s", settingsPath)
	data, err := os.ReadFile(settingsPath)
	if err != nil {
		if os.IsNotExist(err) {
			log.Printf("Файл настроек не найден, создаем новый")
			return settings, Save(settings)
		}
		log.Printf("Ошибка чтения настроек: %v", err)
		return nil, err
	}

	if err := json.Unmarshal(data, settings); err != nil {
		log.Printf("Ошибка парсинга настроек: %v", err)
		return nil, err
	}

	log.Printf("Настройки загружены успешно")
	return settings, nil
}

func Save(settings *Settings) error {
	if (runtime.GOOS == "android" || runtime.GOOS == "ios") && fyneApp != nil {
		log.Printf("Сохраняем настройки через Fyne Storage")
		storage := fyneApp.Storage()

		data, err := json.MarshalIndent(settings, "", "  ")
		if err != nil {
			log.Printf("Ошибка сериализации настроек: %v", err)
			return err
		}

		writer, err := storage.Create("settings.json")
		if err != nil {
			log.Printf("Ошибка создания файла в Fyne Storage: %v", err)
			return err
		}
		defer writer.Close()

		_, err = writer.Write(data)
		if err != nil {
			log.Printf("Ошибка сохранения через Fyne Storage: %v", err)
			return err
		}

		log.Printf("Настройки сохранены через Fyne Storage")
		return nil
	}

	log.Printf("Сохраняем настройки в: %s", settingsPath)
	data, err := json.MarshalIndent(settings, "", "  ")
	if err != nil {
		log.Printf("Ошибка сериализации настроек: %v", err)
		return err
	}

	err = os.WriteFile(settingsPath, data, 0644)
	if err != nil {
		log.Printf("Ошибка записи настроек: %v", err)
		return err
	}

	log.Printf("Настройки сохранены успешно")
	return nil
}
