# sumaexcel/styles.py
from typing import Dict, Any, Optional, Union
from openpyxl.styles import (
    Font, PatternFill, Alignment, Border, Side,
    NamedStyle, Protection, Color
)
from openpyxl.styles.differential import DifferentialStyle
from openpyxl.formatting.rule import Rule
from openpyxl.worksheet.worksheet import Worksheet

class StyleManager:
    """Excel style management class""" 

    @staticmethod
    def create_font(
        name: str = "Arial",
        size: int = 11,
        bold: bool = False,
        italic: bool = False,
        color: str = "000000",
        underline: str = None,
        strike: bool = False
    ) -> Font:
        """Create a Font object with specified parameters""" 
        return Font(
            name=name,
            size=size,
            bold=bold,
            italic=italic,
            color=color,
            underline=underline,
            strike=strike
        )

    @staticmethod
    def create_fill(
        fill_type: str = "solid",
        start_color: str = "FFFFFF",
        end_color: str = None
    ) -> PatternFill:
        """Create a PatternFill object""" 
        return PatternFill(
            fill_type=fill_type,
            start_color=start_color,
            end_color=end_color or start_color
        )

    @staticmethod
    def create_border(
        style: str = "thin",
        color: str = "000000" 
    ) -> Border:
        """Create a Border object""" 
        side = Side(style=style, color=color)
        return Border(
            left=side,
            right=side,
            top=side,
            bottom=side
        )

    @staticmethod
    def create_alignment(
        horizontal: str = "general",
        vertical: str = "bottom",
        wrap_text: bool = False,
        shrink_to_fit: bool = False,
        indent: int = 0
    ) -> Alignment:
        """Create an Alignment object""" 
        return Alignment(
            horizontal=horizontal,
            vertical=vertical,
            wrap_text=wrap_text,
            shrink_to_fit=shrink_to_fit,
            indent=indent
        )

    @staticmethod
    def copy_style(source_cell: Any, target_cell: Any) -> None:
        """Copy all style properties from source cell to target cell""" 
        target_cell.font = Font(
            name=source_cell.font.name,
            size=source_cell.font.size,
            bold=source_cell.font.bold,
            italic=source_cell.font.italic,
            color=source_cell.font.color,
            underline=source_cell.font.underline,
            strike=source_cell.font.strike
        )

        if source_cell.fill.patternType != None:
            target_cell.fill = PatternFill(
                fill_type=source_cell.fill.patternType,
                start_color=source_cell.fill.start_color.rgb,
                end_color=source_cell.fill.end_color.rgb
            )

        target_cell.border = Border(
            left=source_cell.border.left,
            right=source_cell.border.right,
            top=source_cell.border.top,
            bottom=source_cell.border.bottom
        )

        target_cell.alignment = Alignment(
            horizontal=source_cell.alignment.horizontal,
            vertical=source_cell.alignment.vertical,
            wrap_text=source_cell.alignment.wrap_text,
            shrink_to_fit=source_cell.alignment.shrink_to_fit,
            indent=source_cell.alignment.indent
        )

        if source_cell.number_format:
            target_cell.number_format = source_cell.number_format
