# aiva/core/downscale_manager.py

import logging
import time

class DownscaleManager:
    def __init__(self, video_encoder, transition_time=2.0):
        self.video_encoder = video_encoder
        self.transition_time = transition_time
        self.logger = logging.getLogger(__name__)

    def downscale(self, target_resolution):
        """Downscales the video gradually to the target resolution."""
        current_resolution = self.video_encoder.get_resolution()
        start_time = time.time()
        elapsed_time = 0.0

        self.logger.info(f"Initiating downscale from {current_resolution} to {target_resolution} over {self.transition_time} seconds.")

        while elapsed_time < self.transition_time:
            elapsed_time = time.time() - start_time
            progress = elapsed_time / self.transition_time

            # Calculate intermediate resolution based on progress
            intermediate_width = int(current_resolution[0] + (target_resolution[0] - current_resolution[0]) * progress)
            intermediate_height = int(current_resolution[1] + (target_resolution[1] - current_resolution[1]) * progress)
            intermediate_resolution = (intermediate_width, intermediate_height)

            self.video_encoder.set_resolution(intermediate_resolution)
            self.logger.debug(f"Downscaling to {intermediate_resolution} (Progress: {progress:.2f})")

            time.sleep(0.1)  # Small delay for smooth transition

        # Ensure the final resolution is set correctly
        self.video_encoder.set_resolution(target_resolution)
        self.logger.info(f"Downscale complete. Resolution set to {target_resolution}.")

    def set_transition_time(self, transition_time):
        """Sets the transition time for downscale events."""
        if transition_time > 0:
            self.transition_time = transition_time
            self.logger.info(f"Transition time set to {transition_time} seconds.")
        else:
            self.logger.warning("Invalid transition time. Must be greater than 0.")
