#include "Settings.h"
#include <fstream>
#include <sstream>
#include <SDL3/SDL.h>

// Singleton instance
Settings& Settings::instance() {
    static Settings s_instance;
    return s_instance;
}

Settings::Settings() {
    // Constructor - defaults already set in header
}

std::string Settings::getSettingsPath() {
    // Save settings.ini in the game's directory
    return "settings.ini";
}

bool Settings::load() {
    std::ifstream file(getSettingsPath());
    if (!file.is_open()) {
        SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Settings file not found, using defaults. Creating settings file with defaults.");
        // Persist defaults so next run has an explicit settings.ini
        try {
            save();
        } catch (...) {}
        return false;
    }
    
    std::string line;
    std::string currentSection;
    
    while (std::getline(file, line)) {
        // Trim whitespace
        size_t start = line.find_first_not_of(" \t\r\n");
        size_t end = line.find_last_not_of(" \t\r\n");
        if (start == std::string::npos) continue; // Empty line
        line = line.substr(start, end - start + 1);
        
        // Skip comments
        if (line[0] == ';' || line[0] == '#') continue;
        
        // Check for section header
        if (line[0] == '[' && line[line.length() - 1] == ']') {
            currentSection = line.substr(1, line.length() - 2);
            continue;
        }
        
        // Parse key=value
        size_t equalsPos = line.find('=');
        if (equalsPos == std::string::npos) continue;
        
        std::string key = line.substr(0, equalsPos);
        std::string value = line.substr(equalsPos + 1);
        
        // Trim key and value
        key.erase(key.find_last_not_of(" \t") + 1);
        value.erase(0, value.find_first_not_of(" \t"));
        
        // Parse settings
        if (currentSection == "Display") {
            if (key == "Fullscreen") {
                m_fullscreen = (value == "1" || value == "true" || value == "True");
            }
        } else if (currentSection == "Audio") {
            if (key == "Music") {
                m_musicEnabled = (value == "1" || value == "true" || value == "True");
            } else if (key == "Sound") {
                m_soundEnabled = (value == "1" || value == "true" || value == "True");
            }
        } else if (currentSection == "Gameplay") {
            if (key == "SmoothScroll") {
                m_smoothScrollEnabled = (value == "1" || value == "true" || value == "True");
                } else if (key == "UpRotateClockwise") {
                    m_upRotateClockwise = (value == "1" || value == "true" || value == "True");
            }
        } else if (currentSection == "Player") {
            if (key == "Name") {
                m_playerName = value;
            }
        } else if (currentSection == "Debug") {
            if (key == "Enabled") {
                m_debugEnabled = (value == "1" || value == "true" || value == "True");
            }
        }
    }
    
    file.close();
    SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Settings loaded from %s", getSettingsPath().c_str());
    return true;
}

bool Settings::save() {
    std::ofstream file(getSettingsPath());
    if (!file.is_open()) {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to save settings to %s", getSettingsPath().c_str());
        return false;
    }
    
    // Write settings in INI format
    file << "; Tetris Game Settings\n";
    file << "; This file is auto-generated\n\n";
    
    file << "[Display]\n";
    file << "Fullscreen=" << (m_fullscreen ? "1" : "0") << "\n\n";
    
    file << "[Audio]\n";
    file << "Music=" << (m_musicEnabled ? "1" : "0") << "\n";
    file << "Sound=" << (m_soundEnabled ? "1" : "0") << "\n\n";
    
    file << "[Gameplay]\n";
    file << "SmoothScroll=" << (m_smoothScrollEnabled ? "1" : "0") << "\n\n";
    file << "UpRotateClockwise=" << (m_upRotateClockwise ? "1" : "0") << "\n\n";

    file << "[Player]\n";
    file << "Name=" << m_playerName << "\n\n";
    
    file << "[Debug]\n";
    file << "Enabled=" << (m_debugEnabled ? "1" : "0") << "\n";
    
    file.close();
    SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Settings saved to %s", getSettingsPath().c_str());
    return true;
}
