#!/usr/bin/env python3
'''
Candela Technologies Inc.
Info : Standard Script for WLAN Capacity Calculator
Date :
Author : Anjali Rahamatkar
'''

import argparse
import sys
import os

from pip._internal.utils import logging

if 'py-json' not in sys.path:
    sys.path.append(os.path.join(os.path.abspath('..'), 'py-json'))
import wlan_theoretical_sta

# main method

def main():

    parse = wlan_theoretical_sta.abg11_calculator.create_argparse( prog='wlan_capacity_calculator.py',
        formatter_class=argparse.RawTextHelpFormatter,
        epilog='''\
             This python script calculates the theoretical value of three different stations( 11abg/11n/11ac)''',
        description='''\
        wlan_capacity_calculator.py
        ---------------------------------------------------------------------------

    Example of command line to run(11ac Station):
   ./wlan_capacity_calculator.py 
        -sta 11ac 
        -t Voice 
        -d 9 
        -spa 3    
        -ch 20
        -gu 800 
        -high 1
        -e TKIP
        -q Yes 
        -ip 3
        -mc 0
        -b 6 12 24 54
        -m 1518
        -co Greenfield
        -cw 15
            ''')

    try:
        args = parse.parse_args()
        # Station
        if (args.station is not None):
            Calculator_name = args.station
        else:
            Calculator_name = "11abg"

        # Traffic Type
        if (args.traffic is not None):
            traffic_name = args.traffic
        else:
            traffic_name = "Data"

        # PHY Bit Rate
        if (args.phy is not None):
            phy_name = args.phy
        else:
            phy_name = "54"

        # Encryption
        if (args.encryption is not None):
            encryption_name = args.encryption
        else:
            encryption_name = "None"

        # QoS

        if (args.qos is not None):
            qos_name = args.qos
        else:
            if "11abg" in Calculator_name:
                qos_name = "No"
            if "11n" in Calculator_name or "11ac" in Calculator_name:
                qos_name = "Yes"

        # 802.11 MAC Frame

        if (args.mac is not None):
            mac_name = args.mac
        else:
            mac_name = "1518"

        # Basic Rate Set

        if (args.basic is not None):
            basic_name = args.basic
        else:
            basic_name = ['1', '2', '5.5', '11', '6', '12', '24']

        # Preamble value

        if (args.preamble is not None):
            preamble_name = args.preamble
        else:
            preamble_name = "Short"

        # Slot Time

        if (args.slot is not None):
            slot_name = args.slot
        else:
            slot_name = "Short"

        # Codec Type (Voice Traffic)

        if (args.codec is not None):
            codec_name = args.codec
        else:
            if "11abg" in Calculator_name:
                codec_name = "G.723"
            if "11n" in Calculator_name:
                codec_name = "G.711"
            if "11ac" in Calculator_name:
                codec_name = "Mixed"

        # RTS/CTS Handshake

        if (args.rts is not None):
            rts_name = args.rts
        else:
            rts_name = "No"

        # CTS - to - self(protection)

        if (args.cts is not None):
            cts_name = args.cts
        else:
            cts_name = "No"

        # station = 11n and 11ac

        # Data/Voice MCS Index

        if (args.data is not None):
            data_name = args.data
        else:
            if "11n" in Calculator_name:
                data_name = "7"
            if "11ac" in Calculator_name:
                data_name = "9"

        # Channel Bandwidth

        if (args.channel is not None):
            channel_name = args.channel
        else:
            if "11n" in Calculator_name:
                channel_name = "40"
            if "11ac" in Calculator_name:
                channel_name = "80"

        # Guard Interval

        if (args.guard is not None):
            guard_name = args.guard
        else:
            guard_name = "400"

        # Highest Basic MCS

        if (args.highest is not None):
            highest_name = args.highest
        else:
            highest_name = '1'

        # PLCP Configuration

        if (args.plcp is not None):
            plcp_name = args.plcp
        else:
            plcp_name = "Mixed"

        # IP Packets per A-MSDU

        if (args.ip is not None):
            ip_name = args.ip
        else:
            ip_name = "0"

        # MAC Frames per A-MPDU

        if (args.mc is not None):
            mc_name = args.mc
        else:
            if "11n" in Calculator_name:
                mc_name = '42'
            if "11ac" in Calculator_name:
                mc_name = '64'

        # CWmin (leave alone for default)

        if (args.cwin is not None):
            cwin_name = args.cwin
        else:
            cwin_name = '15'

        # Spatial Streams

        if (args.spatial is not None):
            spatial_name = args.spatial
        else:
            spatial_name = '4'

        # RTS/CTS Handshake and CTS-to-self

        if (args.rtscts is not None):
            rtscts_name = args.rtscts
        else:
            rtscts_name = 'No'


    except Exception as e:
        logging.exception(e)
        exit(2)

    # Select station(802.11a/b/g/n/ac standards)

    if "11abg" in Calculator_name:
        Station1 = wlan_theoretical_sta.abg11_calculator(traffic_name, phy_name, encryption_name, qos_name, mac_name, basic_name,
                                    preamble_name, slot_name, codec_name, rts_name, cts_name)
        Station1.calculate()
        Station1.get_result()

    if "11n" in Calculator_name:
        Station2 = wlan_theoretical_sta.n11_calculator(traffic_name, data_name, channel_name, guard_name, highest_name, encryption_name,
                                  qos_name, ip_name,
                                  mc_name, basic_name, mac_name,
                                  codec_name, plcp_name, cwin_name, rts_name, cts_name)
        Station2.calculate()
        Station2.get_result()
    if "11ac" in Calculator_name:
        Station3 = wlan_theoretical_sta.ac11_calculator(traffic_name, data_name, spatial_name, channel_name, guard_name, highest_name,
                                   encryption_name
                                   , qos_name, ip_name, mc_name, basic_name, mac_name,
                                   codec_name, cwin_name, rtscts_name)
        Station3.calculate()
        Station3.get_result()


if __name__ == "__main__":
    main()