from modules import scripts
import gradio as gr
import json
import os


STYLE_FILE = os.path.join(scripts.basedir(), "styles.json")

EMPTY_STYLE = {"styles": {}, "deleted": {}}


class StyleManager:
    def __init__(self):
        self.STYLE_SHEET: dict = None

    def load_styles(self):
        if os.path.isfile(STYLE_FILE):
            with open(STYLE_FILE, "r", encoding="utf-8") as json_file:
                self.STYLE_SHEET = json.load(json_file)
                print("[Vec. CC] Style Sheet Loaded...")

        else:
            with open(STYLE_FILE, "w+", encoding="utf-8") as json_file:
                self.STYLE_SHEET = EMPTY_STYLE
                json.dump(self.STYLE_SHEET, json_file)
                print("[Vec. CC] Creating Empty Style Sheet...")

        return self.list_style()

    def list_style(self) -> list[str]:
        return list(self.STYLE_SHEET["styles"].keys())

    def get_style(self, style_name: str) -> tuple[bool | str | float]:
        style: dict = self.STYLE_SHEET["styles"].get(style_name, None)

        if not style:
            print(f'\n[Error] No Style of name "{style_name}" was found!\n')
            return [gr.update()] * 12

        return (
            style.get("alt", gr.update()),
            style.get("brightness", gr.update()),
            style.get("contrast", gr.update()),
            style.get("saturation", gr.update()),
            *style.get("rgb", (gr.update(), gr.update(), gr.update())),
            style.get("hr", gr.update()),
            style.get("ad", gr.update()),
            style.get("rn", gr.update()),
            style.get("noise", gr.update()),
            style.get("scaling", gr.update()),
        )

    def save_style(
        self,
        style_name: str,
        latent: bool,
        bri: float,
        con: float,
        sat: float,
        r: float,
        g: float,
        b: float,
        hr: bool,
        ad: bool,
        rn: bool,
        noise: str,
        scaling: str,
    ):
        if style_name in self.STYLE_SHEET["styles"]:
            print(f'\n[Error] Duplicated Style Name: "{style_name}" Detected!')
            print("Values were not saved!\n")
            return self.list_style()

        new_style = {
            "alt": latent,
            "brightness": bri,
            "contrast": con,
            "saturation": sat,
            "rgb": [r, g, b],
            "hr": hr,
            "ad": ad,
            "rn": rn,
            "noise": noise,
            "scaling": scaling,
        }

        self.STYLE_SHEET["styles"].update({style_name: new_style})

        with open(STYLE_FILE, "w+") as json_file:
            json.dump(self.STYLE_SHEET, json_file)

        print(f'\nStyle of Name "{style_name}" Saved!\n')
        return self.list_style()

    def delete_style(self, style_name: str):
        if style_name not in self.STYLE_SHEET["styles"]:
            print(f'\n[Error] No Style of name "{style_name}" was found!\n')
            return self.list_style()

        style: dict = self.STYLE_SHEET["styles"].get(style_name)
        self.STYLE_SHEET["deleted"].update({style_name: style})
        del self.STYLE_SHEET["styles"][style_name]

        with open(STYLE_FILE, "w+") as json_file:
            json.dump(self.STYLE_SHEET, json_file)

        print(f'\nStyle of name "{style_name}" was deleted!\n')
        return self.list_style()
