#!/usr/bin/env python
#
# Copyright 2018 Espressif Systems (Shanghai) PTE LTD
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from __future__ import print_function
from __future__ import unicode_literals
from future import standard_library
standard_library.install_aliases()
from builtins import str
from builtins import range
import http.client
import argparse

def start_session (ip, port):
    return http.client.HTTPConnection(ip, int(port), timeout=15)

def end_session (conn):
    conn.close()

def getreq (conn, path, verbose = False):
    conn.request("GET", path)
    resp = conn.getresponse()
    data = resp.read()
    if verbose:
        print("GET : " + path)
        print("Status : " + resp.status)
        print("Reason : " + resp.reason)
        print("Data length  : " + str(len(data)))
        print("Data content : " + data)
    return data

def postreq (conn, path, data, verbose = False):
    conn.request("POST", path, data)
    resp = conn.getresponse()
    data = resp.read()
    if verbose:
        print("POST : " + data)
        print("Status : " + resp.status)
        print("Reason : " + resp.reason)
        print("Data length  : " + str(len(data)))
        print("Data content : " + data)
    return data

def putreq (conn, path, body, verbose = False):
    conn.request("PUT", path, body)
    resp = conn.getresponse()
    data = resp.read()
    if verbose:
        print("PUT : " + path, body)
        print("Status : " + resp.status)
        print("Reason : " + resp.reason)
        print("Data length  : " + str(len(data)))
        print("Data content : " + data)
    return data

if __name__ == '__main__':
    # Configure argument parser
    parser = argparse.ArgumentParser(description='Run HTTPd Test')
    parser.add_argument('IP'  , metavar='IP'  ,    type=str, help='Server IP')
    parser.add_argument('port', metavar='port',    type=str, help='Server port')
    parser.add_argument('N'   , metavar='integer', type=int, help='Integer to sum upto')
    args = vars(parser.parse_args())

    # Get arguments
    ip   = args['IP']
    port = args['port']
    N    = args['N']

    # Establish HTTP connection
    print("Connecting to => " + ip + ":" + port)
    conn = start_session (ip, port)

    # Reset adder context to specified value(0)
    # -- Not needed as new connection will always
    # -- have zero value of the accumulator
    print("Reset the accumulator to 0")
    putreq (conn, "/adder", str(0))

    # Sum numbers from 1 to specified value(N)
    print("Summing numbers from 1 to " + str(N))
    for i in range(1, N+1):
        postreq (conn, "/adder", str(i))

    # Fetch the result
    print("Result :" + getreq (conn, "/adder"))

    # Close HTTP connection
    end_session (conn)
