"""Manage Infix containers"""
import time
from infamy.util import warn


class Container:
    """Helper methods"""
    HTTPD_IMAGE = "/lib/oci/curios-httpd-latest.tar.gz"
    NFTABLES_IMAGE = "/lib/oci/curios-nftables-latest.tar.gz"

    def __init__(self, target):
        self.system = target

    def _find(self, name):
        oper = self.system.get_data("/infix-containers:containers")
        if not oper:
            return None

        for container in oper["containers"]["container"]:
            if container["name"] == name:
                return container
        return None

    def exists(self, name):
        """Check if container {name} runs on target."""
        container = self._find(name)
        if not container:
            return False
        return True

    def running(self, name):
        """Check if container {name} exists and is running."""
        container = self._find(name)
        if container and container["running"]:
            return True
        return False

    def action(self, name, act):
        """Call container action (context RPC), retry three times."""
        xpath = f"/infix-containers:containers/container[name='{name}']/{act}"

        for attempt in range(3):
            try:
                return self.system.call_action(xpath)
            except Exception as e:
                warn(f"failed {act} {name} ({attempt + 1}/3): {e}")
                time.sleep(1)
                if attempt == 2:
                    raise
