import os
import tempfile
import textwrap
import unittest
from pathlib import Path

from bpython import config

TEST_THEME_PATH = Path(os.path.join(os.path.dirname(__file__), "test.theme"))


class TestConfig(unittest.TestCase):
    def load_temp_config(self, content):
        """Write config to a temporary file and load it."""

        with tempfile.NamedTemporaryFile() as f:
            f.write(content.encode("utf8"))
            f.flush()

            return config.Config(Path(f.name))

    def test_load_theme(self):
        color_scheme = dict()
        config.load_theme(TEST_THEME_PATH, color_scheme, dict())
        expected = {"keyword": "y"}
        self.assertEqual(color_scheme, expected)

        defaults = {"name": "c"}
        expected.update(defaults)
        config.load_theme(TEST_THEME_PATH, color_scheme, defaults)
        self.assertEqual(color_scheme, expected)

    def test_keybindings_default_contains_no_duplicates(self):
        struct = self.load_temp_config("")

        keys = (attr for attr in dir(struct) if attr.endswith("_key"))
        mapped_keys = [
            getattr(struct, key) for key in keys if getattr(struct, key)
        ]

        mapped_keys_set = set(mapped_keys)
        self.assertEqual(len(mapped_keys), len(mapped_keys_set))

    def test_keybindings_use_default(self):
        struct = self.load_temp_config(
            textwrap.dedent(
                """
            [keyboard]
            help = F1
            """
            )
        )

        self.assertEqual(struct.help_key, "F1")

    def test_keybindings_use_other_default(self):
        struct = self.load_temp_config(
            textwrap.dedent(
                """
            [keyboard]
            help = C-h
            """
            )
        )

        self.assertEqual(struct.help_key, "C-h")
        self.assertEqual(struct.backspace_key, "")

    def test_keybindings_use_other_default_issue_447(self):
        struct = self.load_temp_config(
            textwrap.dedent(
                """
            [keyboard]
            help = F2
            show_source = F9
            """
            )
        )

        self.assertEqual(struct.help_key, "F2")
        self.assertEqual(struct.show_source_key, "F9")

    def test_keybindings_unset(self):
        struct = self.load_temp_config(
            textwrap.dedent(
                """
            [keyboard]
            help =
            """
            )
        )

        self.assertFalse(struct.help_key)

    def test_keybindings_unused(self):
        struct = self.load_temp_config(
            textwrap.dedent(
                """
            [keyboard]
            help = F4
            """
            )
        )

        self.assertEqual(struct.help_key, "F4")
