"""Silique (https://www.silique.fr)
Copyright (C) 2022-2026

This program is free software: you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
details.

You should have received a copy of the GNU Lesser General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""

from pathlib import Path
from typing import Optional
from tiramisu import Config
from warnings import warn

from .convert import RougailConvert, SUPPORTED_VERSION
from ..types import rougail_type
from ..config import RougailConfig
from ..user_data import UserData
from ..tiramisu import tiramisu_display_name


class Rougail(UserData):
    """Main Rougail object"""

    def __init__(
        self,
        rougailconfig: Optional[RougailConfig] = None,
        load_from_tiramisu_cache: bool = False,
    ) -> None:
        if rougailconfig is None:
            rougailconfig = RougailConfig
        self.rougailconfig = rougailconfig
        self.load_from_tiramisu_cache = (
            load_from_tiramisu_cache
            and Path(self.rougailconfig["tiramisu_cache"]).is_file()
        )
        types = rougail_type(self.rougailconfig)
        if not self.load_from_tiramisu_cache:
            self.converted = RougailConvert(self.rougailconfig, **types)
        self.config = None

    def get_root_option(self):
        if not self.load_from_tiramisu_cache:
            tiram_obj = self.converted.save()
        else:
            tiramisu_cache = self.rougailconfig["tiramisu_cache"]
            with open(tiramisu_cache, "r", encoding="utf-8") as tiramisu:
                tiram_obj = tiramisu.read()
        optiondescription = {}
        custom_types = {
            custom.__name__: custom
            for custom in self.rougailconfig["custom_types"].values()
        }
        exec(tiram_obj, custom_types, optiondescription)  # pylint: disable=W0122
        return optiondescription["option_0"]

    def run(self, *, name: Optional[str] = None):
        """Get Tiramisu Config"""
        if not self.config:
            self.config = Config(
                self.get_root_option(),
                name=name,
                display_name=tiramisu_display_name,
            )
            self.config.property.read_write()
        return self.config

    def get_config(self):
        warn(
            "get_config is deprecated, use run instead",
            DeprecationWarning,
            stacklevel=2,
        )
        return self.run()
