#!/usr/bin/env python 

import argparse
import sniffer
import ccid
import ccid_select
import mitm

import usb.core
import usb.util
import sys
import time

def find_dev():
    dev = usb.core.find(idVendor=0x1d50, idProduct=0x60e3)
    if dev is None:
        raise ValueError("Device not found")
    else:
        print("Found device")
    return dev

# main code
def main():
    parser = argparse.ArgumentParser()
# FIXME: config names instead of numbers
    parser.add_argument("-C", "--conf", type=int, choices=[1, 2, 3, 4], help="Set USB config")
    parser.add_argument("-s", "--sniff", help="Sniff communication!", action='store_true') 
    parser.add_argument("-S", "--select_file", help="Transmit SELECT cmd!", action='store_true')
    parser.add_argument("-p", "--phone", help="Emulates simcard", action='store_true')
    parser.add_argument("-m", "--mitm", help="Intercept communication (MITM)", action='store_true')

    args = parser.parse_args()
    print("args: ", args)
    dev = find_dev()

    if args.conf is not None:
        dev.set_configuration(args.conf)
        # Give pcsclite time to find the device
        time.sleep(1)
    if args.sniff is True:
        sniffer.sniff(dev)
# FIXME: This command is test code and should be removed in near future:
    if args.select_file is True:
        ccid_select.select()
    if args.phone is True:
        mitm.do_mitm(dev, sim_emul=True)
    if args.mitm is True:
        mitm.do_mitm(dev, sim_emul=False)
    return

main()
