import logging
import socket
import requests
import json

from ipaddress import ip_address

from os.path import join as join_path


def create_package_loggers(packages, base_path, mode="a"):
    loggers = {}
    for pkg in packages:
        logger = logging.getLogger(pkg)
        logger_handler = logging.FileHandler(
            join_path(base_path, "{}.txt".format(pkg)),
            mode=mode
        )
        logger.setLevel(logging.DEBUG)
        logger_handler.setFormatter(logging.Formatter(fmt="%(asctime)s: %(levelname)s - %(message)s",
                                                      datefmt="%d-%b-%y %H:%M:%S"))
        logger.addHandler(logger_handler)
        loggers[pkg] = logger


# TODO: Should be removed as soon as migration
#       mechanism is finalized inside ucloud
def get_ipv4_address():
    # If host is connected to internet
    #   Return IPv4 address of machine
    # Otherwise, return 127.0.0.1
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
        try:
            s.connect(("8.8.8.8", 80))
        except socket.timeout:
            address = "127.0.0.1"
        except Exception as e:
            logging.getLogger().exception(e)
            address = "127.0.0.1"
        else:
            address = s.getsockname()[0]

    return address


def get_ipv6_address():
    try:
        r = requests.get("https://api6.ipify.org?format=json")
        content = json.loads(r.content.decode("utf-8"))
        ip = ip_address(content["ip"]).exploded
    except Exception as e:
        logging.exception(e)
    else:
        return ip