import docker
import subprocess
import os
import sys
import time
from docker import Client
from . import constant

alpineDict = {
      "name":        "docker.io/library/alpine:latest",
		"shortName":   "alpine",
		"tarballName": "alpine.tar"}

def get_client():
   client = docker.Client(base_url="http://localhost:8080",timeout=15)
   return client

client = get_client()

def podman():
    binary = os.getenv("PODMAN_BINARY")
    if binary is None:
        binary = "bin/podman"
    return binary

def restore_image_from_cache(TestClass):
   alpineImage = os.path.join(constant.ImageCacheDir , alpineDict["tarballName"])
   if not os.path.exists(alpineImage):
      os.makedirs(constant.ImageCacheDir)
      client.pull(constant.ALPINE)
      response = client.get_image(constant.ALPINE)
      image_tar = open(alpineImage,mode="wb")
      image_tar.write(response.data)
      image_tar.close()
   else :
      TestClass.podman = subprocess.run(
      [
            podman(), "load", "-i", alpineImage
      ],
      shell=False,
      stdin=subprocess.DEVNULL,
      stdout=subprocess.DEVNULL,
      stderr=subprocess.DEVNULL,
   )

def run_top_container():
   c = client.create_container(image=constant.ALPINE,command='/bin/sleep 5',name=constant.TOP)
   client.start(container=c.get("Id"))
   return c.get("Id")

def enable_sock(TestClass):
   TestClass.podman = subprocess.Popen(
      [
            podman(), "system", "service", "tcp:localhost:8080",
            "--log-level=debug", "--time=0"
      ],
      shell=False,
      stdin=subprocess.DEVNULL,
      stdout=subprocess.DEVNULL,
      stderr=subprocess.DEVNULL,
   )
   time.sleep(2)

def terminate_connection(TestClass):
   TestClass.podman.terminate()
   stdout, stderr = TestClass.podman.communicate(timeout=0.5)
   if stdout:
      print("\nService Stdout:\n" + stdout.decode('utf-8'))
   if stderr:
      print("\nService Stderr:\n" + stderr.decode('utf-8'))

   if TestClass.podman.returncode > 0:
      sys.stderr.write("podman exited with error code {}\n".format(
            TestClass.podman.returncode))
      sys.exit(2)

def remove_all_containers():
   containers = client.containers(quiet=True)
   for c in containers:
      client.remove_container(container=c.get("Id"), force=True)

def remove_all_images():
   allImages = client.images()
   for image in allImages:
      client.remove_image(image,force=True)