import socket
import time

import requests


def tcp(host, port=80, count=1, timeout=1):
    result = []
    for _ in range(count):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(timeout)
        start_time = time.time()
        try:
            s.connect((host, port))
            s.shutdown(socket.SHUT_RD)
            stop_time = time.time()
            result.append(round(1000 * (stop_time - start_time), 2))
        except socket.timeout:
            result.append(-1)
        except OSError as e:
            print("OS Error:", e)
            result.append(-1)
        finally:
            s.close()
    return result


def scan(host, ports=(22, 80, 443), timeout=5):
    scan_result = []
    for port in ports:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(timeout)
        result = sock.connect_ex((host, port))
        sock.close()
        if result == 0:
            scan_result.append(True)
        else:
            scan_result.append(False)
    return scan_result


def speed_test(url, method='HEAD', proxy=None, count=1, timeout=5):
    result = []
    for _ in range(count):
        start_time = time.time()
        try:
            if method in ('HEAD', 'head'):
                requests.head(url, proxies=proxy, timeout=timeout)
            elif method in ('GET', 'get'):
                requests.get(url, proxies=proxy, timeout=timeout)
            stop_time = time.time()
            result.append(round(1000 * (stop_time - start_time), 2))
        except requests.exceptions.Timeout:
            result.append('-1')
    return result