from __future__ import annotations

from .args import Args
from .window import Window
from .storage import Storage


class Settings:
    speed: str
    mode: str
    merge: bool

    score_enabled: bool
    travel_enabled: bool
    think_enabled: bool
    words_enabled: bool

    @staticmethod
    def prepare() -> None:
        settings = Storage.get_settings()
        changed = False

        if Args.speed:
            Settings.speed = Args.speed
            changed = True
        else:
            Settings.speed = settings.get("speed", "normal")

        speed = Settings.speed.capitalize()
        Window.speed.setCurrentText(speed)

        Settings.score_enabled = settings.get("score_enabled", True)
        Settings.travel_enabled = settings.get("travel_enabled", True)
        Settings.think_enabled = settings.get("think_enabled", True)
        Settings.words_enabled = settings.get("words_enabled", True)

        Settings.merge = settings.get("merge", True)

        if changed:
            Settings.save()

    @staticmethod
    def save() -> None:
        settings = {
            "speed": Settings.speed,
            "merge": Settings.merge,
            "score_enabled": Settings.score_enabled,
            "travel_enabled": Settings.travel_enabled,
            "think_enabled": Settings.think_enabled,
            "words_enabled": Settings.words_enabled,
        }

        Storage.save_settings(settings)

    @staticmethod
    def set_speed(speed: str) -> None:
        Settings.speed = speed
        Settings.save()

    @staticmethod
    def toggle_merge() -> None:
        Settings.merge = not Settings.merge
        Settings.save()

    @staticmethod
    def toggle_score_enabled() -> None:
        Settings.score_enabled = not Settings.score_enabled
        Settings.save()

    @staticmethod
    def toggle_travel_enabled() -> None:
        Settings.travel_enabled = not Settings.travel_enabled
        Settings.save()

    @staticmethod
    def toggle_think_enabled() -> None:
        Settings.think_enabled = not Settings.think_enabled
        Settings.save()

    @staticmethod
    def toggle_words_enabled() -> None:
        Settings.words_enabled = not Settings.words_enabled
        Settings.save()

    @staticmethod
    def enable_all() -> None:
        Settings.merge = True
        Settings.score_enabled = True
        Settings.travel_enabled = True
        Settings.think_enabled = True
        Settings.words_enabled = True
        Settings.save()

    @staticmethod
    def disable_all() -> None:
        Settings.merge = False
        Settings.score_enabled = False
        Settings.travel_enabled = False
        Settings.think_enabled = False
        Settings.words_enabled = False
        Settings.save()
