from pptx.dml.color import RGBColor
from pptx.util import Inches, Length
from pydantic import BaseModel

from services.ppt_generator.configs.standard_configs import (DefaultSettings,
                                                             SlideWorkArea)

sell_side_mna = """
    You should include many slides on the industry which have reasonable depth and structure. This should be 4-5 slides.
"""


class DefaultConfig(BaseModel):
    "Default config"

    client: str = "default"
    ppt_template: str = "ppt_templates/ppt_template.pptx"
    chroma_db: str = "default"
    layout_file: str = "default"
    layout_choices: str = (
        "./services/ppt_generator/layouts/generic/content_slide_layout_choices_v4.txt"
    )
    slide_work_area: SlideWorkArea = SlideWorkArea(
        top=Inches(1.35), left=Inches(0.17), width=Inches(13.01), height=Inches(5.74)
    )
    default_settings: DefaultSettings = DefaultSettings(
        font="Arial.ttf",
        font_size=16,
        font_color=RGBColor(0, 0, 0),
        light_font_color=RGBColor(255, 255, 255),
    )
    structure_recommendation: dict[str, str] = {
        "merger and acquisition sell side": sell_side_mna
    }
    client_type: str = "ib"

    def __str__(self):
        return str(self.__class__)

    def __repr__(self):
        return str(self.__class__)

    @classmethod
    def init_with_custom_values(cls, config_dict: dict) -> "DefaultConfig":
        """
        Initialize DefaultConfig with custom values from a dictionary.
        Updates the class's default values with the provided config values.
        """
        # EMU (English Metric Unit) to inches conversion factor

        # Convert slide work area values from EMUs to Inches if provided
        if config_dict.get("slide_work_area") is not None:
            slide_work_area = config_dict.get("slide_work_area")
            # Convert EMUs to inches
            config_dict["slide_work_area"] = SlideWorkArea(
                top=Inches(
                    float(slide_work_area.get("top", 1234440)) / Length._EMUS_PER_INCH
                ),  # py-lint disable=W0212
                left=Inches(
                    float(slide_work_area.get("left", 155448)) / Length._EMUS_PER_INCH
                ),  # py-lint disable=W0212
                width=Inches(
                    float(slide_work_area.get("width", 11896344))
                    / Length._EMUS_PER_INCH
                ),  # py-lint disable=W0212
                height=Inches(
                    float(slide_work_area.get("height", 5248656))
                    / Length._EMUS_PER_INCH
                ),  # py-lint disable=W0212
            )
        # Convert default settings colors to RGBColor if provided
        if config_dict.get("default_settings") is not None:
            default_settings = config_dict.get("default_settings")
            try:
                # Get RGB values from the config
                font_color = default_settings.get("font_color", ["0", "0", "0"])
                light_font_color = default_settings.get(
                    "light_font_color", ["255", "255", "255"]
                )

                # Ensure we have exactly 3 values and convert to integers
                if isinstance(font_color, (list, tuple)) and isinstance(
                    light_font_color, (list, tuple)
                ):
                    r, g, b = map(int, font_color[:3])
                    lr, lg, lb = map(int, light_font_color[:3])

                    config_dict["default_settings"] = DefaultSettings(
                        font=default_settings.get("font", "Arial.ttf"),
                        font_size=int(default_settings.get("font_size", "16")),
                        font_color=RGBColor(r, g, b),
                        light_font_color=RGBColor(lr, lg, lb),
                    )
                else:
                    raise ValueError("Color values must be lists or tuples")

            except (ValueError, TypeError, IndexError) as e:
                print(f"Error processing colors: {e}")
                config_dict["default_settings"] = DefaultSettings(
                    font=default_settings.get("font", "Arial.ttf"),
                    font_size=int(default_settings.get("font_size", "16")),
                    font_color=RGBColor(0, 0, 0),
                    light_font_color=RGBColor(255, 255, 255),
                )

        # Create a new instance with the updated values
        new_instance = cls(
            client=config_dict.get("client", cls.model_fields["client"].default),
            ppt_template=config_dict.get(
                "ppt_template", cls.model_fields["ppt_template"].default
            ),
            chroma_db=config_dict.get(
                "chroma_db", cls.model_fields["chroma_db"].default
            ),
            layout_file=config_dict.get(
                "layout_file", cls.model_fields["layout_file"].default
            ),
            layout_choices=config_dict.get(
                "layout_choices", cls.model_fields["layout_choices"].default
            ),
            slide_work_area=config_dict.get(
                "slide_work_area", cls.model_fields["slide_work_area"].default
            ),
            default_settings=config_dict.get(
                "default_settings", cls.model_fields["default_settings"].default
            ),
            structure_recommendation=config_dict.get(
                "structure_recommendation",
                cls.model_fields["structure_recommendation"].default,
            ),
            client_type=config_dict.get(
                "client_type", cls.model_fields["client_type"].default
            ),
        )
        return new_instance

    @classmethod
    def get_default_dict(cls) -> dict:
        """
        Returns a dictionary containing all default values from the DefaultConfig.
        """
        default_values = cls.model_fields

        return {
            "client": default_values["client"].default,
            "ppt_template": default_values["ppt_template"].default,
            "chroma_db": default_values["chroma_db"].default,
            "layout_file": default_values["layout_file"].default,
            "layout_choices": default_values["layout_choices"].default,
            "slide_work_area": default_values["slide_work_area"].default,
            "default_settings": default_values["default_settings"].default,
            "structure_recommendation": default_values[
                "structure_recommendation"
            ].default,
            "client_type": default_values["client_type"].default,
        }


if __name__ == "__main__":
    "Test the config"
    default_config = DefaultConfig.get_default_dict()
    print(default_config, "default_config")
