# MODULES #
import sys
import socket
import os
import time
import struct

from actions.argument_parser import *
from data import *

# STATIC VARIABLES #
nm = __file__


# CMD FUNCTIONS #
def help(cmd="0"):
    help_dic = {
        "connect": "Use connect: \n\t" + nm + " connect [IP] [PORT] (port default = 5678)",
        "wake": "Use wake: \n\t" + nm + " -a [For Wake all]  / -i [IP]"
    }

    # default help
    if cmd == "0":
        for com in help_dic.values():
            print com
    else:
        print help_dic[cmd]


def wake(ip):
    print "Sending packets to:", ip  # (EN) Sending magic packet to: IP
    mac = arp[ip]
    print "MAC:", mac
    wake_on_lan(mac)
    """
    time.sleep(2)
    while i == 20:
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            server_address = (ip, int(port))
            sock.connect(server_address)
        except:
            pass
    """


def connect(ip, port):
    # (EN) Trying connection to IP:Port
    print "Trying connection to", ip + ":" + port
    try_connection(ip, port)
    time.sleep(2)
    send_cmd(sock)
    time.sleep(5)


def read_arp():
    # arp.dat is an ethernet/ip address database
    arch = open("data/arp.dat")

    for line in arch:
        line = line.strip().split("-")
        print line
    arch.close()


def wake_on_lan(mac_address):
    if len(mac_address) == 12:
        pass
    elif len(mac_address) == 12 + 5:
        sep = mac_address[2]
        mac_address = mac_address.replace(sep, '')
    else:
        raise ValueError('Wrong MAC Address format!')  # (EN) Incorrect MAC format!

    data = ''.join(['FFFFFFFFFFFF', mac_address * 20])
    send_data = ''

    for i in range(0, len(data), 2):
        send_data = ''.join([send_data, struct.pack('B', int(data[i: i + 2], 16))])

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    s.sendto(send_data, ('<broadcast>', 7))


def send_cmd(s):
    while True:
        # Se ingresa por teclado el comando que deseamos
        # (EN) Gets command from user
        cmd = raw_input("command->")

        # enviamos el comando
        # (EN) Sends the command
        s.send(cmd)

        time.sleep(2)

        # recibimos la salida
        # (EN) Receives output
        output = sock.recv(100000)

        # se imprime por pantalla la salida
        # (EN) Prints output
        print output


def try_connection(ip, port):
    global sock
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server_address = (ip, int(port))
        sock.connect(server_address)
    except socket.error:
        print "[ERROR] Could not establish a connection to the server"


###### ARGS
if __name__ == "__main__":
    try:
        os.system("clear")
    except:
        pass

    args = ArgsProcessClient(__file__)