#!/usr/bin/python

from sap import *
import time

def connect_disconnect_by_client(sap):

    print "[Test] Connect - Disconnect by client \n"

    try:
        if not sap.isConnected():
           sap.connect()

        if sap.proc_connect():
            if sap.proc_disconnectByClient():
                print "OK"
                return 0

        print "NOT OK"
        return 1

    except BluetoothError , e:
        print "Error " + str(e)


def connect_disconnect_by_server_gracefully(sap, timeout=0):

    print "[Test] Connect - Disconnect by server with timer \n"

    try:
        if not sap.isConnected():
           sap.connect()

        if sap.proc_connect():
            if sap.proc_disconnectByServer(timeout):
                print "OK"
                return 0

        print "NOT OK"
        return 1

    except BluetoothError , e:
        print "Error " + str(e)


def connect_txAPDU_disconnect_by_client(sap):

    print "[Test] Connect - TX APDU - Disconnect by client \n"

    try:
        if not sap.isConnected():
           sap.connect()

        if sap.proc_connect():
            if not sap.proc_transferAPDU():
                print "NOT OK 1"
                return 1

            if not sap.proc_transferAPDU():
                print "NOT OK 2"
                return 1

            if not sap.proc_transferAPDU():
                print "NOT OK 3"
                return 1

            if not sap.proc_transferAPDU():
                print "NOT OK 4"
                return 1

            if sap.proc_disconnectByClient():
                print "OK"
                return 0

        print "NOT OK"
        return 1

    except BluetoothError , e:
        print "Error " + str(e)

def connect_rfcomm_only_and_wait_for_close_by_server(sap):

    print "[Test] Connect rfcomm only  - Disconnect by server timeout \n"

    if not sap.isConnected():
       sap.connect()

    time.sleep(40)
    print "OK"

def power_sim_off_on(sap):

    print "[Test] Powe sim off \n"

    try:
        if not sap.isConnected():
           sap.connect()

        if sap.proc_connect():
            if not sap.proc_resetSim():
                print "NOT OK"
                return 1

            if not sap.proc_powerSimOff():
                print "NOT OK"
                return 1

            if not sap.proc_powerSimOn():
                print "NOT OK"
                return 1

            if sap.proc_disconnectByClient():
                print "OK"
                return 0

        print "NOT OK"
        return 1

    except BluetoothError , e:
        print "Error " + str(e)


if __name__ == "__main__":

    host = "00:00:00:00:00:0"  # server bd_addr
    port = 8  # sap server port

    try:
        s = SAPClient(host, port)
    except BluetoothError , e:
        print "Error " + str(e)

    connect_disconnect_by_client(s)
    connect_disconnect_by_server_gracefully(s)
    connect_disconnect_by_server_gracefully(s, 40)  #  wait 40 sec for srv to close rfcomm sock
    connect_rfcomm_only_and_wait_for_close_by_server(s)
    connect_txAPDU_disconnect_by_client(s)
    power_sim_off_on(s)
