class FrequencyController:
    """Handles frequency control and display logic"""
    
    def __init__(self, initial_frequency=1.0, update_callback=None):
        self.frequency_value = initial_frequency
        self.decimal_place = 0  # 0=ones, 1=tenths, 2=hundredths, etc.
        self.update_callback = update_callback or (lambda freq, period, place: None)
        
        # Frequency limits
        self.min_frequency = 0.001
        self.max_frequency = 999.999
        self.max_decimal_places = 3
        
        self._notify_update()
    
    def get_frequency(self):
        """Get current frequency value"""
        return self.frequency_value
    
    def get_period(self):
        """Get current period (1/frequency)"""
        return 1.0 / self.frequency_value
    
    def get_decimal_place(self):
        """Get current decimal place being edited"""
        return self.decimal_place
    
    def get_decimal_place_name(self):
        """Get human-readable name for current decimal place"""
        places = ["Ones", "Tenths", "Hundredths", "Thousandths"]
        return places[min(self.decimal_place, len(places)-1)]
    
    def frequency_up(self):
        """Increase frequency at current decimal place"""
        increment = 10 ** (-self.decimal_place)
        self.frequency_value = round(self.frequency_value + increment, 3)
        self.frequency_value = min(self.frequency_value, self.max_frequency)
        self._notify_update()
    
    def frequency_down(self):
        """Decrease frequency at current decimal place"""
        increment = 10 ** (-self.decimal_place)
        self.frequency_value = round(self.frequency_value - increment, 3)
        self.frequency_value = max(self.frequency_value, self.min_frequency)
        self._notify_update()
    
    def decimal_place_left(self):
        """Move decimal place to the left (higher significance)"""
        self.decimal_place = max(0, self.decimal_place - 1)
        self._notify_update()
    
    def decimal_place_right(self):
        """Move decimal place to the right (lower significance)"""
        self.decimal_place = min(self.max_decimal_places, self.decimal_place + 1)
        self._notify_update()
    
    def set_frequency(self, frequency):
        """Set frequency directly"""
        self.frequency_value = max(self.min_frequency, min(frequency, self.max_frequency))
        self.frequency_value = round(self.frequency_value, 3)
        self._notify_update()
    
    def _notify_update(self):
        """Notify callback of frequency update"""
        if self.update_callback:
            self.update_callback(
                self.frequency_value,
                self.get_period(),
                self.get_decimal_place_name()
            )
    
    def get_display_info(self):
        """Get all display information as a dictionary"""
        return {
            'frequency': self.frequency_value,
            'period': self.get_period(),
            'decimal_place': self.decimal_place,
            'decimal_place_name': self.get_decimal_place_name(),
            'frequency_display': f"{self.frequency_value:.3f}",
            'period_display': f"Period: {self.get_period():.3f}s"
        }