import unittest

from lib.hard_reset_linux import executar_hard_reset_linux


class ClienteLinuxFake:
    def __init__(self, codigos_retorno=None):
        self.comandos = []
        self.codigos_retorno = list(codigos_retorno or [])

    def executar_comando(self, comando, disparar_excecao_se_retorno_nao_zero=True, echoar=True, descricao=""):
        self.comandos.append((comando, disparar_excecao_se_retorno_nao_zero))
        codigo_retorno = self.codigos_retorno.pop(0) if self.codigos_retorno else 0

        class ResultadoFake:
            def __init__(self, codigo_retorno):
                self.codigo_retorno = codigo_retorno

        return ResultadoFake(codigo_retorno)


class TestHardResetLinux(unittest.TestCase):
    def test_executar_hard_reset_linux_para_containers_prune_e_apaga_home(self):
        cliente_linux = ClienteLinuxFake()

        executar_hard_reset_linux(cliente_linux, "deploy")

        self.assertEqual(
            cliente_linux.comandos,
            [
                ("docker ps -q | xargs -r docker stop", False),
                ("docker ps -aq | xargs -r docker rm -f", False),
                ("find /home/deploy -mindepth 1 -maxdepth 1 -exec rm -rf -- {} +", False),
                ("docker system prune -af --volumes", False),
            ]
        )

    def test_executar_hard_reset_linux_usa_docker_quando_usuario_nao_consegue_apagar_home(self):
        cliente_linux = ClienteLinuxFake(codigos_retorno=[0, 0, 1, 0, 0])

        executar_hard_reset_linux(cliente_linux, "deploy")

        self.assertEqual(
            cliente_linux.comandos,
            [
                ("docker ps -q | xargs -r docker stop", False),
                ("docker ps -aq | xargs -r docker rm -f", False),
                ("find /home/deploy -mindepth 1 -maxdepth 1 -exec rm -rf -- {} +", False),
                (
                    "docker run --rm -v /home/deploy:/home-hard-reset alpine:3.20 sh -c "
                    "'find /home-hard-reset -mindepth 1 -maxdepth 1 -exec rm -rf -- {} +'",
                    True
                ),
                ("docker system prune -af --volumes", False),
            ]
        )

    def test_executar_hard_reset_linux_bloqueia_usuario_invalido(self):
        cliente_linux = ClienteLinuxFake()

        with self.assertRaises(ValueError):
            executar_hard_reset_linux(cliente_linux, "../deploy")

        self.assertEqual(cliente_linux.comandos, [])


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