#! /usr/bin/env python
# -*- Mode: python; py-indent-offset: 4; tab-width: 8; indent-tabs-mode: t; -*-

import pprint
import os
import sys
import subprocess
import json
import argparse
import io
import time

from flask import Flask, json, Response, render_template, make_response, request

#
# TODO: remove this! We don't use JSON argument here!
# curl http://127.0.0.1:8080/wm/onos/flows/delete/{"value":"0xf"}/json'
#

## Global Var ##
ControllerIP="127.0.0.1"
ControllerPort=8080

DEBUG=0
pp = pprint.PrettyPrinter(indent=4)

app = Flask(__name__)

## Worker Functions ##
def log_error(txt):
  print '%s' % (txt)

def debug(txt):
  if DEBUG:
    print '%s' % (txt)

# @app.route("/wm/onos/flows/delete/<flow-id>/json")
def delete_flow_path(flow_id):
  command = "curl -s \"http://%s:%s/wm/onos/flows/delete/%s/json\"" % (ControllerIP, ControllerPort, flow_id)
  debug("delete_flow_path %s" % command)
  result = os.popen(command).read()
  debug("result %s" % result)
  # parsedResult = json.loads(result)
  # debug("parsed %s" % parsedResult)

if __name__ == "__main__":
  usage_msg = "Delete flow state from the ONOS Network Map and the switches\n"
  usage_msg = usage_msg + "Usage: %s <begin-flow-id> <end-flow-id>\n" % (sys.argv[0])
  usage_msg = usage_msg + "       %s <flow-id>\n" % (sys.argv[0])
  usage_msg = usage_msg + "\n"
  usage_msg = usage_msg + "    Arguments:\n"
  usage_msg = usage_msg + "        <begin-flow-id> <end-flow-id>      Delete all flows in the flow ID range\n"
  usage_msg = usage_msg + "        <flow-id>                          Delete a single flow with the flow ID\n"
  usage_msg = usage_msg + "        all                                Delete all flows\n"

  # app.debug = False;

  # Usage info
  if len(sys.argv) > 1 and (sys.argv[1] == "-h" or sys.argv[1] == "--help"):
    print(usage_msg)
    exit(0)

  # Check arguments
  if len(sys.argv) < 2:
    log_error(usage_msg)
    exit(1)

  if (sys.argv[1] == "all"):
    delete_flow_path(sys.argv[1])
  else:
    begin_flow_id = int(sys.argv[1], 0)
    if len(sys.argv) >= 3:
      end_flow_id = int(sys.argv[2], 0)
    else:
      end_flow_id = begin_flow_id

    # Do the work
    flow_id = begin_flow_id
    while flow_id <= end_flow_id:
      delete_flow_path(flow_id)
      flow_id = flow_id + 1
