#!/usr/bin/python3

import requests
import json
import sys
from time import gmtime, strftime

requests.packages.urllib3.disable_warnings()


def x2_login(board_addr, username, password):
    # Create request
    url = "https://" + board_addr + "/api2/tokens"
    data = {}
    data["username"] = username
    data["password"] = password

    # Send Request
    headers = {"content-type": "application/json"}
    r = requests.post(url, headers=headers, json=data, verify=False)
    print(r.status_code)
    print(r.content)
    return json.loads(r.content)


def x2_create_ruleset(board_addr, token, set_name):
    # Prepare request
    url = "https://" + board_addr + "/api2/tm/rulesets"
    data = {}
    data["name"] = set_name
    data["description"] = "A simple RuleSet crated by Python using Profitap API"
    headers = {}
    headers["content-type"] = "application/json"
    headers["Authorization"] = token

    # Check result
    r = requests.post(url, headers=headers, json=data, verify=False)
    print(r.status_code)
    print(r.content)

    # Return set id
    resp = json.loads(r.content)
    return resp["data"]


def x2_create_rules(board_addr, token, set_id):
    # Prepare request
    url = "https://" + board_addr + "/api2/tm/rulesets/" + str(set_id) + "/rules/"
    headers = {}
    headers["content-type"] = "application/json"
    headers["Authorization"] = token

    # Set static data
    src_ports = []
    src_ports.append({})
    src_ports[0] = {}
    src_ports[0]["id"] = 1
    src_ports[0]["type"] = "INF"
    src_ports.append({})
    src_ports[1] = {}
    src_ports[1]["id"] = 5
    src_ports[1]["type"] = "INF"

    dst_ports = []
    dst_ports.append({})
    dst_ports[0] = {}
    dst_ports[0]["id"] = 9
    dst_ports[0]["type"] = "INF"
    dst_ports.append({})
    dst_ports[1] = {}
    dst_ports[1]["id"] = 13
    dst_ports[1]["type"] = "INF"

    data = {}
    data["src_ports"] = src_ports
    data["dst_ports"] = dst_ports
    data["enable_counter"]: False
    data["filter"] = {}
    data["filter"]["l2"] = {}
    data["filter"]["l2"]["eth_type"] = {}
    data["filter"]["l2"]["eth_type"]["type"] = "hex16"
    data["filter"]["l2"]["eth_type"]["val"] = "0800"
    data["filter"]["l2"]["eth_type"]["mask"] = "FFFF"
    data["filter"]["l3"] = {}
    data["filter"]["l3"]["dst_addr"] = {}
    data["filter"]["l3"]["dst_addr"]["type"] = "ipv4"
    # data['filter']['l3']['dst_addr']['val'] = 'ipv4'
    data["filter"]["l3"]["dst_addr"]["mask"] = "255.255.255.255"
    data["filter"]["l4"] = {}

    # Define list of destionation IP addresses
    dst_ip_addrs = ["192.168.1.200", "192.168.10.200", "8.8.8.8", "10.1.1.1"]

    for ip_addr in dst_ip_addrs:
        data["name"] = "Rule_ip_" + ip_addr.replace(".", "_")
        data["filter"]["l3"]["dst_addr"]["val"] = ip_addr
        r = requests.post(url, headers=headers, json=data, verify=False)
        print(r.status_code)
        print(r.content)


if __name__ == "__main__":
    board_url = "x2-device-ip"
    username = "admin"
    password = "Adminadmin1"

    auth_reply = x2_login(board_url, username, password)
    rule_set = x2_create_ruleset(
        board_url,
        auth_reply["token"],
        "RuleSet_" + strftime("%Y_%m_%d_%H_%M_%S", gmtime()),
    )
    x2_create_rules(board_url, auth_reply["token"], rule_set["id"])