#!/usr/bin/python3
# LAVA Controls Copyright 2022 LAVA Controls - Stephen Loeckle

import argparse
import socket
import binascii
import sys
import inspect
import traceback
from lavacontrolscorelib import buildtm, DisplayInfo, getpowermode, saveconfig, sethdmimodes, setpower, Timeout
import lavacontrolsneclib as lcnec

PORT = 7142


def main():
    gotthefunc = inspect.stack()[0][3]
    parser = argparse.ArgumentParser(description='LAVA Controls CLI')
    parser.add_argument('ip', help = 'IP of Requested Display')
    parser.add_argument('-c', '--cmd', help = "Full Command to Send to Display in format: '01 30 2A 30 43 30 36 02 30 32 33 45 03 1A 0D'", nargs=1)
    parser.add_argument('-r', '--raw', help = "RAW Command to Send to Display Without SOH, BCC or Delimiter in format: '30 2A 30 43 30 36 02 30 32 33 45 03'", nargs=1)
    parser.add_argument('-hsize', '--hnum', help = 'Change Tile Horizonal Count (integer 1-10)', nargs=1)
    parser.add_argument('-i', '--input', help = 'Change lcnec.Input (hdmi, dvi or dp)', nargs=1)
    parser.add_argument('-p', '--pos', help = 'Change Tile Position (integer 1-100)', nargs=1)
    parser.add_argument('-t', '--tilemode', help = 'Change Tile Mode (on or off)', nargs=1)
    parser.add_argument('-s', '--save', help = 'Save config after command')
    parser.add_argument('-vsize', '--vnum', help = 'Change Tile Vertical Count (integer 1-10)', nargs=1)
    parser.add_argument('-vol', '--volume', help = 'Change lcnec.Volume (integer)', nargs=1)
    cliargs = parser.parse_args()

    if (not cliargs.ip):
        parser.error('IP required')
    else:
        ip = cliargs.ip.strip()
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(10)
    s.connect((ip, PORT))
    
    if (not cliargs.raw or not cliargs.cmd):
        displayid = 0
        dispconn = DisplayInfo(displayid,s)
        displayid = dispconn.getid()
    elif cliargs.raw:
        raw = cliargs.raw[0].strip()
        if raw[:2] == '01':
            raw = raw[3:]
        if raw[-2:] == '0D':
            raw = raw[:-5]
        print('\n')
        print('Original RAW Command: {}'.format(rawcmd))
        cmd = lcnec.xor(raw)
    elif cliargs.cmd:
        cmd = cliargs.cmd[0].strip()
        
    if (cliargs.raw or cliargs.cmd):
        print('Full Command: {}'.format(cmd))
        cmd = bytes.fromhex(cmd)
        s.send(cmd)
        received = s.recv(27)
        hexreceived = binascii.b2a_hex(received)
        print('Response: {}'.format(hexreceived.decode()))
        print('\n')

    if cliargs.hnum:
        try:
            tmcomp = lcnec.Tiling(displayid,s)
        except:
            pass
            msg = ('D{}: Error in {}!'.format(displayid,gotthefunc))
            print(msg)
            err = traceback.format_exc()
            msg = ('D{}: Error in {} Detail: {}'.format(displayid,gotthefunc,err))
            print(msg)
        try:
            hsize = tmcomp.sethsize(int(cliargs.hnum[0]))
        except:
            pass
            msg = ('D{}: Error in {}!'.format(displayid,gotthefunc))
            print(msg)
            err = traceback.format_exc()
            msg = ('D{}: Error in {} Detail: {}'.format(displayid,gotthefunc,err))
            print(msg)
        else:
            print('D{}: Tile horizontal count set to: {}'.format(displayid,hsize))
            
    if cliargs.pos:
        try:
            tmcomp = lcnec.Tiling(displayid,s)
        except:
            pass
            msg = ('D{}: Error in {}!'.format(displayid,gotthefunc))
            print(msg)
            err = traceback.format_exc()
            msg = ('D{}: Error in {} Detail: {}'.format(displayid,gotthefunc,err))
            print(msg)
        try:
            pos = tmcomp.setpos(int(cliargs.pos[0]))
        except:
            pass
            msg = ('D{}: Error in {}!'.format(displayid,gotthefunc))
            print(msg)
            err = traceback.format_exc()
            msg = ('D{}: Error in {} Detail: {}'.format(displayid,gotthefunc,err))
            print(msg)
        else:
            print('D{}: Tile position set to: {}'.format(displayid,hsize))
        
        
    if cliargs.vnum:
        try:
            tmcomp = lcnec.Tiling(displayid,s)
        except:
            pass
            msg = ('D{}: Error in {}!'.format(displayid,gotthefunc))
            print(msg)
            err = traceback.format_exc()
            msg = ('D{}: Error in {} Detail: {}'.format(displayid,gotthefunc,err))
            print(msg)
        try:
            vsize = tmcomp.setvsize(int(cliargs.vnum[0]))
        except:
            pass
            msg = ('D{}: Error in {}!'.format(displayid,gotthefunc))
            print(msg)
            err = traceback.format_exc()
            msg = ('D{}: Error in {} Detail: {}'.format(displayid,gotthefunc,err))
            print(msg)
        else:
            print('D{}: Tile vertical count set to: {}'.format(displayid,vsize))
        
    if cliargs.save:
        saveconfig(displayid,s)

    s.close()


if __name__ == '__main__':
   main()