import tkinter as tk
from tkinter import ttk
from typing import TYPE_CHECKING

from core.gui.images import ImageEnum, Images
from core.gui.themes import DIALOG_PAD

if TYPE_CHECKING:
    from core.gui.app import Application


class Dialog(tk.Toplevel):
    def __init__(
        self,
        app: "Application",
        title: str,
        modal: bool = True,
        master: tk.BaseWidget = None,
    ) -> None:
        if master is None:
            master = app
        super().__init__(master)
        self.withdraw()
        self.app: "Application" = app
        self.modal: bool = modal
        self.title(title)
        self.protocol("WM_DELETE_WINDOW", self.destroy)
        image = Images.get(ImageEnum.CORE, 16)
        self.tk.call("wm", "iconphoto", self._w, image)
        self.columnconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)
        self.top: ttk.Frame = ttk.Frame(self, padding=DIALOG_PAD)
        self.top.grid(sticky=tk.NSEW)

    def show(self) -> None:
        self.transient(self.master)
        self.focus_force()
        self.update()
        self.deiconify()
        if self.modal:
            self.wait_visibility()
            self.grab_set()
            self.wait_window()

    def draw_spacer(self, row: int = None) -> None:
        frame = ttk.Frame(self.top)
        frame.grid(row=row, sticky=tk.NSEW)
        frame.rowconfigure(0, weight=1)
        self.top.rowconfigure(frame.grid_info()["row"], weight=1)