import pygame
from utils import CONFIG, Figure

from .base import BaseScreen, SceenElement


class Preview(BaseScreen, SceenElement):
    """
    Class representing the preview of upcoming figures on the sidebar.

    Attributes:
        surface: Pygame surface representing the preview.
        rect: Pygame rectangle representing the preview.
        display_surface: Pygame display surface.
        increment_height: Height of each figure in the preview.
    """

    def __init__(self) -> None:
        self._initialize_surface()
        self._initialize_rect()

    def run(self) -> None:
        """Run the preview by updating the display and drawing next figure."""
        self.draw()

    def update(self, next_figure: Figure) -> None:
        """
        Update the preview information.

        Args:
            next_figures: Next figure.
        """
        self.next_figure: Figure = next_figure

    def draw(self) -> None:
        """Draw the preview on the preview surface."""
        self._update_display_surface()
        self._draw_background()
        self._draw_border()
        self._draw_figure()

    def _draw_border(self) -> None:
        """Draw the border around the preview surface."""
        pygame.draw.rect(
            self.display_surface,
            CONFIG.colors.border_highlight,
            self.rect,
            CONFIG.game.line_width * 2,
            CONFIG.game.border_radius,
        )

    def _draw_figure(self) -> None:
        """Draw a single upcoming figure on the preview surface."""
        figure_surface: pygame.Surface = self.next_figure.value.image()
        x = self.surface.get_width() / 2
        y = self.surface.get_height() / 2
        figure_surface.fill(self.next_figure.value.color, special_flags=pygame.BLEND_RGB_MULT)
        rect = figure_surface.get_rect(center=(x, y))
        self.surface.blit(figure_surface, rect)

    def _draw_background(self) -> None:
        """Draw the background of the preview."""
        self.surface.fill(CONFIG.colors.bg_sidebar)

    def _initialize_surface(self) -> None:
        """Initialize the preview surface."""
        self.surface = pygame.Surface(CONFIG.sidebar.preview)
        self.display_surface = pygame.display.get_surface()

    def _initialize_rect(self) -> None:
        """Initialize the preview rectangle."""
        self.rect = self.surface.get_rect(
            topright=(
                CONFIG.window.size.width - CONFIG.window.padding,
                CONFIG.window.padding,
            )
        )

    def _update_display_surface(self) -> None:
        """Update the display surface."""
        self.display_surface.blit(self.surface, self.rect)
