<?php
class Settings {
    private $db;

    public function __construct() {
        $database = new Database();
        $this->db = $database->getConnection();
    }

    /**
     * Get all settings as key-value array
     */
    public function getAll() {
        $stmt = $this->db->prepare("SELECT key_name, value FROM settings");
        $stmt->execute();

        $settings = [];
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $settings[$row['key_name']] = $row['value'];
        }

        return $settings;
    }

    /**
     * Get a specific setting value
     */
    public function get($key, $default = null) {
        $stmt = $this->db->prepare("SELECT value FROM settings WHERE key_name = :key");
        $stmt->bindParam(':key', $key);
        $stmt->execute();

        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        if ($row) {
            return $row['value'];
        }

        return $default;
    }

    /**
     * Update or create a setting
     */
    public function update($key, $value, $description = null) {
        $stmt = $this->db->prepare("
            INSERT INTO settings (key_name, value, description, created_at, updated_at)
            VALUES (:key, :value, :description, NOW(), NOW())
            ON DUPLICATE KEY UPDATE
            value = VALUES(value),
            updated_at = NOW()
        ");

        $stmt->bindParam(':key', $key);
        $stmt->bindParam(':value', $value);
        $stmt->bindParam(':description', $description);

        return $stmt->execute();
    }

    /**
     * Delete a setting
     */
    public function delete($key) {
        $stmt = $this->db->prepare("DELETE FROM settings WHERE key_name = :key");
        $stmt->bindParam(':key', $key);
        return $stmt->execute();
    }

    /**
     * Check if a setting exists
     */
    public function exists($key) {
        $stmt = $this->db->prepare("SELECT COUNT(*) as count FROM settings WHERE key_name = :key");
        $stmt->bindParam(':key', $key);
        $stmt->execute();

        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        return $row['count'] > 0;
    }

    /**
     * Get settings by category/prefix
     */
    public function getByPrefix($prefix) {
        $prefixPattern = $prefix . '%';
        $stmt = $this->db->prepare("SELECT key_name, value FROM settings WHERE key_name LIKE :prefix");
        $stmt->bindParam(':prefix', $prefixPattern);
        $stmt->execute();

        $settings = [];
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $settings[$row['key_name']] = $row['value'];
        }

        return $settings;
    }

    /**
     * Bulk update settings
     */
    public function updateBulk($settings) {
        $this->db->begin_transaction();

        try {
            foreach ($settings as $key => $value) {
                $this->update($key, $value);
            }
            $this->db->commit();
            return true;
        } catch (Exception $e) {
            $this->db->rollback();
            return false;
        }
    }

    /**
     * Get system information
     */
    public function getSystemInfo() {
        return [
            'php_version' => PHP_VERSION,
            'mysql_version' => $this->getMysqlVersion(),
            'app_version' => APP_VERSION ?? '1.0.0',
            'server_software' => $_SERVER['SERVER_SOFTWARE'] ?? 'Unknown',
            'memory_limit' => ini_get('memory_limit'),
            'max_execution_time' => ini_get('max_execution_time'),
            'upload_max_filesize' => ini_get('upload_max_filesize'),
            'post_max_size' => ini_get('post_max_size'),
            'disk_space' => $this->getDiskSpace(),
            'timezone' => date_default_timezone_get(),
        ];
    }

    /**
     * Get MySQL version
     */
    private function getMysqlVersion() {
        try {
            $result = $this->db->query("SELECT VERSION() as version");
            $row = $result->fetch_assoc();
            return $row['version'];
        } catch (Exception $e) {
            return 'Unknown';
        }
    }

    /**
     * Get disk space information
     */
    private function getDiskSpace() {
        try {
            $totalSpace = disk_total_space('.');
            $freeSpace = disk_free_space('.');
            $usedSpace = $totalSpace - $freeSpace;

            return [
                'total' => $totalSpace,
                'used' => $usedSpace,
                'free' => $freeSpace,
                'used_percentage' => round(($usedSpace / $totalSpace) * 100, 2)
            ];
        } catch (Exception $e) {
            return null;
        }
    }

    /**
     * Export settings as JSON
     */
    public function export() {
        $settings = $this->getAll();
        return json_encode($settings, JSON_PRETTY_PRINT);
    }

    /**
     * Import settings from JSON
     */
    public function import($jsonData) {
        try {
            $settings = json_decode($jsonData, true);
            if (json_last_error() !== JSON_ERROR_NONE) {
                return false;
            }

            return $this->updateBulk($settings);
        } catch (Exception $e) {
            return false;
        }
    }

    /**
     * Reset settings to defaults
     */
    public function resetToDefaults() {
        $defaults = [
            'site_title' => 'Excellent Blog',
            'site_description' => 'AI-Powered International Blog Platform',
            'auto_crawl_enabled' => '1',
            'auto_publish_enabled' => '1',
            'ai_generation_enabled' => '1',
            'default_language' => 'en',
            'articles_per_page' => '10',
            'crawl_interval' => '3600'
        ];

        return $this->updateBulk($defaults);
    }
}