package logger

import (
	"os"
	"path/filepath"
)

// GetDataDir возвращает стандартную директорию для данных приложения
func GetDataDir() (string, error) {
	// Проверяем, установлен ли пакет (существует ли /opt/gpio-monitoring)
	if _, err := os.Stat("/opt/gpio-monitoring"); err == nil {
		// Используем стандартную директорию для deb пакета
		dataDir := "/var/lib/gpio-monitoring"
		if err := os.MkdirAll(dataDir, 0755); err != nil {
			return "", err
		}
		return dataDir, nil
	}

	// Для разработки - используем XDG Base Directory Specification
	homeDir, err := os.UserHomeDir()
	if err != nil {
		return "", err
	}

	// ~/.local/share/gpio-monitoring
	dataDir := filepath.Join(homeDir, ".local", "share", "gpio-monitoring")
	if err := os.MkdirAll(dataDir, 0755); err != nil {
		return "", err
	}

	return dataDir, nil
}

// GetLogsDir возвращает директорию для логов
func GetLogsDir() (string, error) {
	// Проверяем, установлен ли пакет
	if _, err := os.Stat("/opt/gpio-monitoring"); err == nil {
		logsDir := "/var/log/gpio-monitoring"
		if err := os.MkdirAll(logsDir, 0755); err != nil {
			return "", err
		}
		return logsDir, nil
	}

	// Для разработки
	dataDir, err := GetDataDir()
	if err != nil {
		return "", err
	}

	logsDir := filepath.Join(dataDir, "logs")
	if err := os.MkdirAll(logsDir, 0755); err != nil {
		return "", err
	}

	return logsDir, nil
}

// GetDataLogsDir возвращает директорию для бинарных данных
func GetDataLogsDir() (string, error) {
	logsDir, err := GetLogsDir()
	if err != nil {
		return "", err
	}

	dataDir := filepath.Join(logsDir, "data")
	if err := os.MkdirAll(dataDir, 0755); err != nil {
		return "", err
	}

	return dataDir, nil
}

// GetEventLogPath возвращает путь к файлу событий
func GetEventLogPath() (string, error) {
	logsDir, err := GetLogsDir()
	if err != nil {
		return "", err
	}

	return filepath.Join(logsDir, "events.log"), nil
}

// GetEventHumanLogPath возвращает путь к человеко-читаемому файлу событий
func GetEventHumanLogPath() (string, error) {
	logsDir, err := GetLogsDir()
	if err != nil {
		return "", err
	}

	return filepath.Join(logsDir, "events_human.log"), nil
}

// GetGPIOLogPath возвращает путь к человеко-читаемому GPIO логу
func GetGPIOLogPath() (string, error) {
	logsDir, err := GetLogsDir()
	if err != nil {
		return "", err
	}

	return filepath.Join(logsDir, "gpio_human.log"), nil
}

// GetWebDir возвращает директорию с веб-файлами
func GetWebDir() string {
	// Проверяем стандартные пути
	possiblePaths := []string{
		"/opt/gpio-monitoring/web",
		"/usr/share/gpio-monitoring/web",
		"./cmd/server/web",
		"../cmd/server/web",
	}

	for _, path := range possiblePaths {
		if _, err := os.Stat(path); err == nil {
			// Проверяем, что есть index.html
			if _, err := os.Stat(filepath.Join(path, "index.html")); err == nil {
				return path
			}
		}
	}

	// Fallback для разработки
	return "./cmd/server/web"
}