"""Unit tests for backend/terminal.py palette and shell-script helpers."""

from __future__ import annotations

import unittest

from bot_bottle.backend.terminal import exec_shell_script, palette_printf


class TestPalettePrintf(unittest.TestCase):
    def test_known_color_returns_printf(self):
        cmd = palette_printf("red")
        self.assertTrue(cmd.startswith("printf '"))
        self.assertIn("\\033]4;9;", cmd)   # bright-red slot
        self.assertIn("\\033]4;1;", cmd)   # normal-red slot
        self.assertIn("\\033]11;", cmd)    # default background tint

    def test_color_sets_both_palette_slots(self):
        cmd = palette_printf("blue")
        self.assertIn("\\033]4;12;", cmd)  # bright-blue slot
        self.assertIn("\\033]4;4;", cmd)   # normal-blue slot

    def test_unknown_color_returns_empty(self):
        self.assertEqual("", palette_printf(""))
        self.assertEqual("", palette_printf("neon-pink"))

    def test_all_named_colors_produce_output(self):
        colors = [
            "red", "green", "yellow", "blue", "magenta",
        ]
        for color in colors:
            with self.subTest(color=color):
                self.assertTrue(palette_printf(color))


class TestExecShellScript(unittest.TestCase):
    _ARGV = ["ssh", "-t", "100.64.0.1", "--", "claude"]

    def test_no_decoration_returns_none(self):
        self.assertIsNone(exec_shell_script(self._ARGV))
        self.assertIsNone(exec_shell_script(self._ARGV, terminal_title="", terminal_color=""))

    def test_title_only_uses_exec(self):
        script = exec_shell_script(self._ARGV, terminal_title="my-agent")
        assert script is not None
        self.assertIn("printf", script)
        self.assertIn("my-agent", script)
        self.assertIn("exec ", script)
        # No palette reset when there's no color
        self.assertNotIn("\\033]104", script)

    def test_color_only_sets_palette_and_resets(self):
        script = exec_shell_script(self._ARGV, terminal_color="green")
        assert script is not None
        self.assertIn("\\033]4;", script)   # indexed palette
        self.assertIn("\\033]11;", script)  # background tint
        self.assertIn("\\033]104", script)  # palette reset
        self.assertIn("\\033]111", script)  # background reset
        # No exec-replace when palette is active (shell must survive for reset)
        parts = script.split("; ")
        agent_part = next(p for p in parts if "ssh" in p)
        self.assertFalse(agent_part.startswith("exec "))

    def test_title_and_color_both_appear(self):
        script = exec_shell_script(self._ARGV, terminal_title="bot", terminal_color="magenta")
        assert script is not None
        self.assertIn("bot", script)
        self.assertIn("\\033]4;", script)
        self.assertIn("\\033]11;", script)
        self.assertIn("\\033]104", script)
        self.assertIn("\\033]111", script)

    def test_title_with_special_chars_is_quoted(self):
        script = exec_shell_script(self._ARGV, terminal_title="my agent's label")
        assert script is not None
        self.assertNotIn("my agent's label", script)  # must be shell-quoted


if __name__ == "__main__":
    unittest.main()
