"""The tests for Home Assistant ffmpeg."""

import os
import shutil
import tempfile

import unittest
from unittest.mock import patch, MagicMock

import homeassistant.components.kira as kira
from homeassistant.setup import setup_component

from tests.common import get_test_home_assistant

TEST_CONFIG = {
    kira.DOMAIN: {
        "sensors": [
            {"name": "test_sensor", "host": "127.0.0.1", "port": 34293},
            {"name": "second_sensor", "port": 29847},
        ],
        "remotes": [
            {"host": "127.0.0.1", "port": 34293},
            {"name": "one_more", "host": "127.0.0.1", "port": 29847},
        ],
    }
}

KIRA_CODES = """
- name: test
  code: "K 00FF"
- invalid: not_a_real_code
"""


class TestKiraSetup(unittest.TestCase):
    """Test class for kira."""

    # pylint: disable=invalid-name
    def setUp(self):
        """Set up things to be run when tests are started."""
        self.hass = get_test_home_assistant()
        _base_mock = MagicMock()
        pykira = _base_mock.pykira
        pykira.__file__ = "test"
        self._module_patcher = patch.dict("sys.modules", {"pykira": pykira})
        self._module_patcher.start()

        self.work_dir = tempfile.mkdtemp()

    def tearDown(self):
        """Stop everything that was started."""
        self.hass.stop()
        self._module_patcher.stop()
        shutil.rmtree(self.work_dir, ignore_errors=True)

    def test_kira_empty_config(self):
        """Kira component should load a default sensor."""
        setup_component(self.hass, kira.DOMAIN, {})
        assert len(self.hass.data[kira.DOMAIN]["sensor"]) == 1

    def test_kira_setup(self):
        """Ensure platforms are loaded correctly."""
        setup_component(self.hass, kira.DOMAIN, TEST_CONFIG)
        assert len(self.hass.data[kira.DOMAIN]["sensor"]) == 2
        assert sorted(self.hass.data[kira.DOMAIN]["sensor"].keys()) == [
            "kira",
            "kira_1",
        ]
        assert len(self.hass.data[kira.DOMAIN]["remote"]) == 2
        assert sorted(self.hass.data[kira.DOMAIN]["remote"].keys()) == [
            "kira",
            "kira_1",
        ]

    def test_kira_creates_codes(self):
        """Kira module should create codes file if missing."""
        code_path = os.path.join(self.work_dir, "codes.yaml")
        kira.load_codes(code_path)
        assert os.path.exists(code_path), "Kira component didn't create codes file"

    def test_load_codes(self):
        """Kira should ignore invalid codes."""
        code_path = os.path.join(self.work_dir, "codes.yaml")
        with open(code_path, "w") as code_file:
            code_file.write(KIRA_CODES)
        res = kira.load_codes(code_path)
        assert len(res) == 1, "Expected exactly 1 valid Kira code"