import os
import json
import logging

logger = logging.getLogger(__name__)

class CPUScaler:
    def __init__(self, config_path='power_saving_config.json'):
        self.config_path = config_path
        self.min_frequency = None
        self.max_frequency = None
        self.current_frequency = None
        self.load_config()

    def load_config(self):
        try:
            with open(self.config_path, 'r') as f:
                config = json.load(f)
                self.min_frequency = config.get('min_cpu_frequency', 400000) # Default 400 kHz
                self.max_frequency = self.get_current_cpu_frequency()
                logger.info(f'Loaded CPU scaling config: min_frequency={self.min_frequency}')
        except FileNotFoundError:
            logger.warning(f'Config file not found: {self.config_path}. Using default min frequency.')
            self.min_frequency = 400000
            self.max_frequency = self.get_current_cpu_frequency()
        except json.JSONDecodeError:
            logger.error(f'Error decoding JSON in {self.config_path}. Using default min frequency.')
            self.min_frequency = 400000
            self.max_frequency = self.get_current_cpu_frequency()
        except Exception as e:
            logger.error(f'Error loading config: {e}. Using default min frequency.')
            self.min_frequency = 400000
            self.max_frequency = self.get_current_cpu_frequency()

    def get_current_cpu_frequency(self):
        try:
            # This is a placeholder.  Replace with actual system call.
            #  Different systems will have different ways to get this.
            with open('/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq', 'r') as f:
                max_freq = int(f.read().strip())
            return max_freq
        except FileNotFoundError:
            logger.warning('Could not determine current CPU frequency.  Using default of 2.0 GHz.')
            return 2000000
        except Exception as e:
            logger.error(f'Error getting current CPU frequency: {e}.  Using default of 2.0 GHz.')
            return 2000000

    def reduce_frequency(self):
        if self.min_frequency is None:
            self.load_config()

        try:
            # This is a placeholder.  Replace with actual system call.
            # Different systems will have different ways to set this.
            # Example using cpufrequtils (may require root privileges):
            # os.system(f'cpufreq-set -d {self.min_frequency} -u {self.min_frequency}')
            with open('/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq', 'w') as f:
                f.write(str(self.min_frequency))
            self.current_frequency = self.min_frequency
            logger.info(f'CPU frequency reduced to {self.min_frequency}')
        except Exception as e:
            logger.error(f'Error reducing CPU frequency: {e}')

    def restore_frequency(self):
        if self.max_frequency is None:
            self.max_frequency = self.get_current_cpu_frequency()

        try:
            # This is a placeholder.  Replace with actual system call.
            # Different systems will have different ways to set this.
            # Example using cpufrequtils (may require root privileges):
            # os.system(f'cpufreq-set -d {self.max_frequency} -u {self.max_frequency}')
            with open('/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq', 'w') as f:
                f.write(str(self.max_frequency))
            self.current_frequency = self.max_frequency
            logger.info(f'CPU frequency restored to {self.max_frequency}')
        except Exception as e:
            logger.error(f'Error restoring CPU frequency: {e}')