import elasticsearch
from flask import Flask, request, make_response, jsonify
from flask.json import JSONDecoder
from flask_httpauth import HTTPBasicAuth
import logging
import datetime
from datetime import datetime, timedelta
from elasticsearch import Elasticsearch
import re
from configparser import ConfigParser
from dateutil import parser, tz

logging.basicConfig(filename='/var/www/html/logs/general_sms_kannel_api.log',
                    filemode='a',
                    format='%(asctime)s %(name)s %(levelname)s %(message)s',
                    level=logging.INFO)
app = Flask(__name__)
#Read config.ini file
config_object = ConfigParser()
config_object.read("config.ini")

#Get info
elasticinfo = config_object["elastic"]
authinfo = config_object["auth"]
auth = HTTPBasicAuth()

USER_DATA = {
    str(authinfo["username"]): str(authinfo["password"])
}

@auth.verify_password
def verify(username, password):
    if not (username and password):
        return False
    return USER_DATA.get(username) == password

@app.route('/sms/general/', methods=['POST', 'GET'])
@auth.login_required
def sms_general():
    es = Elasticsearch(str(elasticinfo["live"]))

    if request.method == 'POST':
        req = request.get_json()
        request_start_date = req['start_date']
        request_end_date = req['end_date']
        today = datetime.utcnow().date()


    
        if not request_start_date.strip() or not request_end_date.strip():
            request_start_date = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc())
            request_end_date = request_start_date + timedelta(days=1, microseconds=-1)
            request_start_date = request_start_date.isoformat()
            request_end_date = request_end_date.isoformat()
        else:
            request_start_date = parser.parse(req['start_date']).isoformat()
            request_end_date = parser.parse(req['end_date']).isoformat()
        

        try:
            # total page_count
            json_payload = {
                "size":0,
                "query":{"bool":{
                "filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"NOT operator_route:internal_gmoneyuser AND NOT operator_route:internal_apiuser"}}]}},
                "aggs":{"count":{"sum":{"field":"page_count"}}}
            }
           
               
            page_count_res = es.search(index="prod-kannel-access-*", body=json_payload)
            page_count = page_count_res['aggregations']['count']['value']
            logging.info(f"Page count:{page_count}")

            # total submit_count
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"NOT operator_route:internal_gmoneyuser AND NOT operator_route:internal_apiuser"}}]}},
                "aggs":{"count":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}
               
            submit_count_res = es.search(index="prod-kannel-access-*", body=json_payload)
            submit_count = submit_count_res['aggregations']['count']['buckets'][0]['doc_count']
            logging.info(f"Total submit_count:{submit_count}")

            # total delivered
            json_payload = {
                "size":0,
                "query":{"bool":
                {"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"NOT operator_route:internal_gmoneyuser AND NOT operator_route:internal_apiuser"}}]}},
                "aggs":{"2":{"filters":{"filters":{"delivery_status:DELIVRD":{"query_string":{"query":"delivery_status:DELIVRD"}}}},
                "aggs":{"3":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"now/d","max":"now/d"}},
                "aggs":{}}}}}
            }
            delivrd_res = es.search(index="prod-kannel-access-*", body=json_payload)
            delivrd = delivrd_res['aggregations']['2']['buckets']['delivery_status:DELIVRD']['doc_count']
            total_delivrd = format((delivrd/submit_count) * 100, '.2f')
            logging.info(f"Total delivered:{total_delivrd}")

            # total undelivered
            json_payload = {
                "size":0,
                "query":{"bool":
                {"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"NOT operator_route:internal_gmoneyuser AND NOT operator_route:internal_apiuser"}}]}},
                "aggs":{"2":{"filters":{"filters":{"delivery_status:UNDELIV":{"query_string":{"query":"delivery_status:UNDELIV"}}}},
                "aggs":{"3":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}
            }
            undelivrd_res = es.search(index="prod-kannel-access-*", body=json_payload)
            undelivrd = undelivrd_res['aggregations']['2']['buckets']['delivery_status:UNDELIV']['doc_count']
            total_undelivrd = format((undelivrd/submit_count) * 100, '.2f')
            logging.info(f"Total Undelivered:{total_undelivrd}")

            # total acknowledged
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"NOT delivery_status:UNDELIV AND NOT delivery_status:DELIVRD AND NOT delivery_status:EXPIRED AND NOT delivery_status:REJECTD AND NOT delivery_status:undeliv AND NOT delivery_status:ENROUTE AND NOT delivery_status:ACCEPTD AND NOT operator_route:internal_gmoneyuser AND NOT operator_route:internal_apiuser"}}]}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0"},
                "aggs":{}}}}
                
            ack_count_res = es.search(index="prod-kannel-access-*", body=json_payload)
            logging.info(f"ack:{ack_count_res}")
            ack_count = ack_count_res['aggregations']['2']['buckets'][0]['doc_count']
            total_ack = format((ack_count/submit_count) * 100, '.2f')
            logging.info(f"Total acknowledged:{total_ack}")

            # total expired
            json_payload = {
                "size":0,
                "query":{"bool":
                {"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"NOT operator_route:internal_gmoneyuser AND NOT operator_route:internal_apiuser"}}]}},
                "aggs":{"2":{"filters":{"filters":{"delivery_status:EXPIRED":{"query_string":{"query":"delivery_status:EXPIRED"}}}},
                "aggs":{"3":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}
            }
            expired_res = es.search(index="prod-kannel-access-*", body=json_payload)
            expired = expired_res['aggregations']['2']['buckets']['delivery_status:EXPIRED']['doc_count']
            total_expired = format((expired/submit_count) * 100, '.2f')

        except Exception as e:
            logging.info(f'failed with error {e}')
            return make_response(jsonify(code=500, error='search failed'), 200)

        return make_response(jsonify(code=200, 
                                    page_count=page_count, 
                                    submit_count=submit_count, 
                                    total_delivered=total_delivrd,
                                    total_undelivered=total_undelivrd,
                                    total_acknowledged=total_ack,
                                    total_expired=total_expired))

        


@app.route('/sms/route/', methods=['POST', 'GET'])
@auth.login_required
def sms_route():
    es = Elasticsearch(str(elasticinfo["live"]))

    if request.method == 'POST':
        req = request.get_json()
        request_start_date = req['start_date']
        request_end_date = req['end_date']
        today = datetime.utcnow().date()

        
        if not request_start_date.strip() or not request_end_date.strip():
            request_start_date = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc())
            request_end_date = request_start_date + timedelta(days=1, microseconds=-1)
            request_start_date = request_start_date.isoformat()
            request_end_date = request_end_date.isoformat()
        else:
            request_start_date = parser.parse(req['start_date']).isoformat()
            request_end_date = parser.parse(req['end_date']).isoformat()
        
                
        try:    
            # sms by route
            json_payload = {
            "size":0,
            "query":{"bool":
            {"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
            {"query_string":{"query":"NOT operator_route:internal_gmoneyuser AND NOT operator_route:internal_apiuser"}}]}},
            "aggs":{"2":{"terms":{"field":"operator_route.keyword","size":10,"order":{"_count":"desc"},"min_doc_count":0},
            "aggs":{"1":{"sum":{"field":"page_count"}}}}}}

            sms_route_res = es.search(index="prod-kannel-access-*", body=json_payload)
            sms_route = dict(total=sms_route_res['hits']['total']['value'], by_key=sms_route_res['aggregations']['2']['buckets'])
            
            # delivered sms by route
            json_payload = {
                "size":0,
                "query":{"bool":
                {"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"NOT operator_route:internal_gmoneyuser AND NOT operator_route:internal_apiuser AND delivery_status:DELIVRD"}}]}},
                "aggs":{"2":{"terms":{"field":"operator_route.keyword","size":10,"order":{"_count":"desc"},"min_doc_count":0},
                "aggs":{}}}}
            delivrd_sms_res = es.search(index="prod-kannel-access-*", body=json_payload)
            delivrd_sms_route = dict(total=delivrd_sms_res['hits']['total']['value'], by_key=delivrd_sms_res['aggregations']['2']['buckets'])
         
        except Exception as e:
            logging.info(f'failed with error {e}')
            return make_response(jsonify(code=500, error='search failed'), 200)

        return make_response(jsonify(code=200, 
                                    sms_route=sms_route, 
                                    delivered_sms_route=delivrd_sms_route))



"""SMS SUBMIT COUNTS"""
@app.route('/sms/submit/', methods=['POST', 'GET'])
@auth.login_required
def sms_submit():
    es = Elasticsearch(str(elasticinfo["live"]))

    if request.method == 'POST':
        req = request.get_json()
        request_start_date = req['start_date']
        request_end_date = req['end_date']
        today = datetime.utcnow().date()

        if not request_start_date.strip() or not request_end_date.strip():
            request_start_date = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc())
            request_end_date = request_start_date + timedelta(days=1, microseconds=-1)
            request_start_date = request_start_date.isoformat()
            request_end_date = request_end_date.isoformat()
        else:
            request_start_date = parser.parse(req['start_date']).isoformat()
            request_end_date = parser.parse(req['end_date']).isoformat()



        try:
            # sms counts by submit
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"NOT operator_route:internal_gmoneyuser AND NOT operator_route:internal_apiuser"}}]}},
                "aggs":{"2":{"terms":{"field":"delivery_status.keyword","size":10,"order":{"_count":"desc"},"min_doc_count":0},
                "aggs":{}}}}

            # ack counts
            ack_payload = {
                "size":0,"query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"NOT delivery_status:UNDELIV AND NOT delivery_status:DELIVRD AND NOT delivery_status:EXPIRED AND NOT delivery_status:REJECTD AND NOT delivery_status:undeliv AND NOT delivery_status:ENROUTE AND NOT delivery_status:ACCEPTD AND NOT operator_route:internal_gmoneyuser AND NOT operator_route:internal_apiuser"}}]}},
                "aggs":{"3":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}

            sms_submit_res = es.search(index="prod-kannel-access-*", body=json_payload)
            sms_submit = dict(total=sms_submit_res['hits']['total']['value'], by_key=sms_submit_res['aggregations']['2']['buckets'])
            ack_count_res = es.search(index="prod-kannel-access-*", body=ack_payload)
            ack_count = ack_count_res['aggregations']['3']['buckets'][0]['doc_count']

        except Exception as e:
            logging.info(f'failed with error {e}')
            return make_response(jsonify(code=500, error='search failed'), 200)

        return make_response(jsonify(code=200, 
                                    sms_submit=sms_submit,
                                    ack_count=ack_count))







@app.route('/sms/mtnmsg/', methods=['POST', 'GET'])
@auth.login_required
def sms_mtnmsg():
    es = Elasticsearch(str(elasticinfo["live"]))

    if request.method == 'POST':
        req = request.get_json()
        request_start_date = req['start_date']
        request_end_date = req['end_date']
        today = datetime.utcnow().date()

        if not request_start_date.strip() or not request_end_date.strip():
            request_start_date = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc())
            request_end_date = request_start_date + timedelta(days=1, microseconds=-1)
            request_start_date = request_start_date.isoformat()
            request_end_date = request_end_date.isoformat()
        else:
            request_start_date = parser.parse(req['start_date']).isoformat()
            request_end_date = parser.parse(req['end_date']).isoformat()
    


        try:   
            # total mtnmsg
            json_payload = {
                "size":0,
                "query":{"bool":
                {"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnmsg"}}]}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":0,"extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}
            mtnmsg_res = es.search(index="prod-kannel-access-*", body=json_payload)
            mtnmsg_count = mtnmsg_res['aggregations']['2']['buckets'][0]['doc_count']
            logging.info(f"mtnnmsg count :{mtnmsg_count}")

            # delivered mtnmsg
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnmsg"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:DELIVRD":{"query_string":{"query":"delivery_status:DELIVRD"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}

            delivrd_mtnmsg_res = es.search(index="prod-kannel-access-*", body=json_payload)
            logging.info(delivrd_mtnmsg_res)
            delivrd_mtnmsg = delivrd_mtnmsg_res['aggregations']['3']['buckets']['delivery_status:DELIVRD']['doc_count']
            logging.info(f"delivered {delivrd_mtnmsg}")
            total_delivrd_mtnmsg = format((delivrd_mtnmsg/mtnmsg_count) * 100, '.2f')
            logging.info(f"total mtnmsg delivered:{total_delivrd_mtnmsg}")

            # undelivered mtnmsg
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnmsg"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:UNDELIV":{"query_string":{"query":"delivery_status:UNDELIV"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}
            undelivrd_mtnmsg_res = es.search(index="prod-kannel-access-*", body=json_payload)
            undelivrd_mtnmsg = undelivrd_mtnmsg_res['aggregations']['3']['buckets']['delivery_status:UNDELIV']['doc_count']
            total_undelivrd_mtnmsg = format((undelivrd_mtnmsg/mtnmsg_count) * 100, '.2f')
            logging.info(f"total mtnmsg undeliverd:{total_undelivrd_mtnmsg}")

             # expired mtnmsg
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnmsg"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:EXPIRED":{"query_string":{"query":"delivery_status:EXPIRED"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}
            expired_mtnmsg_res = es.search(index="prod-kannel-access-*", body=json_payload)
            expired_mtnmsg = expired_mtnmsg_res['aggregations']['3']['buckets']['delivery_status:EXPIRED']['doc_count']
            total_expired_mtnmsg = format((expired_mtnmsg/mtnmsg_count) * 100, '.2f')
            logging.info(f"total mtnmsg expired:{total_expired_mtnmsg}")

            # acknowledged mtnmsg
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnmsg AND NOT delivery_status:UNDELIV AND NOT delivery_status:DELIVRD AND NOT delivery_status:EXPIRED AND NOT delivery_status:REJECTD AND NOT delivery_status:undeliv AND NOT delivery_status:ENROUTE AND NOT delivery_status:ACCEPTD"}}]}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}
            ack_mtnmsg_res = es.search(index="prod-kannel-access-*", body=json_payload)
            ack_mtnmsg = ack_mtnmsg_res['aggregations']['2']['buckets'][0]['doc_count']
            total_ack_mtnmsg = format((ack_mtnmsg/mtnmsg_count) * 100, '.2f')
            logging.info(f"Total acknowledged mtnmsg:{total_ack_mtnmsg}")

        except Exception as e:
            logging.info(f'failed with error {e}')
            return make_response(jsonify(code=500, error='search failed'), 200)

        return make_response(jsonify(code=200, 
                                    total_count=mtnmsg_count, 
                                    total_delivered=total_delivrd_mtnmsg,
                                    total_undelivered=total_undelivrd_mtnmsg,
                                    total_expired=total_expired_mtnmsg,
                                    total_acknowledged=total_ack_mtnmsg))


            
            
@app.route('/sms/mtnnpontu2/', methods=['POST', 'GET'])
@auth.login_required
def sms_mtnnpontu2():
    es = Elasticsearch(str(elasticinfo["live"]))

    if request.method == 'POST':
        req = request.get_json()
        request_start_date = req['start_date']
        request_end_date = req['end_date']
        today = datetime.utcnow().date()

        
        if not request_start_date.strip() or not request_end_date.strip():
            request_start_date = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc())
            request_end_date = request_start_date + timedelta(days=1, microseconds=-1)
            request_start_date = request_start_date.isoformat()
            request_end_date = request_end_date.isoformat()
        else:
            request_start_date = parser.parse(req['start_date']).isoformat()
            request_end_date = parser.parse(req['end_date']).isoformat()
      
        try:    
            # total mtnnpontu2
            json_payload = {
                "size":0,
                "query":{"bool":
                {"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnnpontu2"}}]}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":0,"extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}
            mtnnpontu2_res = es.search(index="prod-kannel-access-*", body=json_payload)
            mtnnpontu2_count = mtnnpontu2_res['aggregations']['2']['buckets'][0]['doc_count']
            logging.info(f"mtnnpontu2 count :{mtnnpontu2_count}")

            # delivered mtnnpontu2
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnnpontu2"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:DELIVRD":{"query_string":{"query":"delivery_status:DELIVRD"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}
            delivrd_mtnnpontu2_res = es.search(index="prod-kannel-access-*", body=json_payload)
            delivrd_mtnnpontu2 = delivrd_mtnnpontu2_res['aggregations']['3']['buckets']['delivery_status:DELIVRD']['doc_count']
            total_delivrd_mtnnpontu2 = format((delivrd_mtnnpontu2/mtnnpontu2_count) * 100, '.2f')
            logging.info(f"total mtnnpontu2 deliverd:{total_delivrd_mtnnpontu2}")

            # undelivered mtnnpontu2
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnnpontu2"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:UNDELIV":{"query_string":{"query":"delivery_status:UNDELIV"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}
            undelivrd_mtnnpontu2_res = es.search(index="prod-kannel-access-*", body=json_payload)
            undelivrd_mtnnpontu2 = undelivrd_mtnnpontu2_res['aggregations']['3']['buckets']['delivery_status:UNDELIV']['doc_count']
            total_undelivrd_mtnnpontu2 = format((undelivrd_mtnnpontu2/mtnnpontu2_count) * 100, '.2f')
            logging.info(f"total mtnnpontu2 undeliverd:{total_undelivrd_mtnnpontu2}")

             # expired mtnnpontu2
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnnpontu2"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:EXPIRED":{"query_string":{"query":"delivery_status:EXPIRED"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}
            expired_mtnnpontu2_res = es.search(index="prod-kannel-access-*", body=json_payload)
            expired_mtnnpontu2 = expired_mtnnpontu2_res['aggregations']['3']['buckets']['delivery_status:EXPIRED']['doc_count']
            total_expired_mtnnpontu2 = format((expired_mtnnpontu2/mtnnpontu2_count) * 100, '.2f')
            logging.info(f"total mtnnpontu2 expired:{total_expired_mtnnpontu2}")

            # acknowledged mtnnpontu2
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnnpontu2 AND NOT delivery_status:UNDELIV AND NOT delivery_status:DELIVRD AND NOT delivery_status:EXPIRED AND NOT delivery_status:REJECTD AND NOT delivery_status:undeliv AND NOT delivery_status:ENROUTE AND NOT delivery_status:ACCEPTD"}}]}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}
            ack_mtnnpontu2_res = es.search(index="prod-kannel-access-*", body=json_payload)
            ack_mtnnpontu2 = ack_mtnnpontu2_res['aggregations']['2']['buckets'][0]['doc_count']
            total_ack_mtnnpontu2 = format((ack_mtnnpontu2/mtnnpontu2_count) * 100, '.2f')
            logging.info(f"Total acknowledged mtnnpontu2:{total_ack_mtnnpontu2}")

        except Exception as e:
            logging.info(f'failed with error {e}')
            return make_response(jsonify(code=500, error='search failed'), 200)

        return make_response(jsonify(code=200, 
                                    total_count=mtnnpontu2_count, 
                                    total_delivered=total_delivrd_mtnnpontu2,
                                    total_undelivered=total_undelivrd_mtnnpontu2,
                                    total_expired=total_expired_mtnnpontu2,
                                    total_acknowledged=total_ack_mtnnpontu2))



@app.route('/sms/mtnnpontu3/', methods=['POST', 'GET'])
@auth.login_required
def sms_mtnnpontu3():
    es = Elasticsearch(str(elasticinfo["live"]))

    if request.method == 'POST':
        req = request.get_json()
        request_start_date = req['start_date']
        request_end_date = req['end_date']
        today = datetime.utcnow().date()

    
        if not request_start_date.strip() or not request_end_date.strip():
            request_start_date = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc())
            request_end_date = request_start_date + timedelta(days=1, microseconds=-1)
            request_start_date = request_start_date.isoformat()
            request_end_date = request_end_date.isoformat()
        else:
            request_start_date = parser.parse(req['start_date']).isoformat()
            request_end_date = parser.parse(req['end_date']).isoformat()
        
            
        try:                
            # total mtnnpontu3
            json_payload = {
                "size":0,
                "query":{"bool":
                {"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnnpontu3"}}]}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":0,"extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}
            mtnnpontu3_res = es.search(index="prod-kannel-access-*", body=json_payload)
            mtnnpontu3_count = mtnnpontu3_res['aggregations']['2']['buckets'][0]['doc_count']
            logging.info(f"mtnnpontu3 count :{mtnnpontu3_count}")

            # delivered mtnnpontu3
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnnpontu3"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:DELIVRD":{"query_string":{"query":"delivery_status:DELIVRD"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}
            delivrd_mtnnpontu3_res = es.search(index="prod-kannel-access-*", body=json_payload)
            delivrd_mtnnpontu3 = delivrd_mtnnpontu3_res['aggregations']['3']['buckets']['delivery_status:DELIVRD']['doc_count']
            total_delivrd_mtnnpontu3 = format((delivrd_mtnnpontu3/mtnnpontu3_count) * 100, '.2f')
            logging.info(f"total mtnnpontu3 deliverd:{total_delivrd_mtnnpontu3}")

            # undelivered mtnnpontu3
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnnpontu3"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:UNDELIV":{"query_string":{"query":"delivery_status:UNDELIV"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}
            undelivrd_mtnnpontu3_res = es.search(index="prod-kannel-access-*", body=json_payload)
            undelivrd_mtnnpontu3 = undelivrd_mtnnpontu3_res['aggregations']['3']['buckets']['delivery_status:UNDELIV']['doc_count']
            total_undelivrd_mtnnpontu3 = format((undelivrd_mtnnpontu3/mtnnpontu3_count) * 100, '.2f')
            logging.info(f"total mtnnpontu3 undeliverd:{total_undelivrd_mtnnpontu3}")

             # expired mtnnpontu3
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnnpontu3"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:EXPIRED":{"query_string":{"query":"delivery_status:EXPIRED"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}
            expired_mtnnpontu3_res = es.search(index="prod-kannel-access-*", body=json_payload)
            expired_mtnnpontu3 = expired_mtnnpontu3_res['aggregations']['3']['buckets']['delivery_status:EXPIRED']['doc_count']
            total_expired_mtnnpontu3 = format((expired_mtnnpontu3/mtnnpontu3_count) * 100, '.2f')
            logging.info(f"total mtnnpontu3 expired:{total_expired_mtnnpontu3}")


            # acknowledged mtnnpontu3
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnnpontu3 AND NOT delivery_status:UNDELIV AND NOT delivery_status:DELIVRD AND NOT delivery_status:EXPIRED AND NOT delivery_status:REJECTD AND NOT delivery_status:undeliv AND NOT delivery_status:ENROUTE AND NOT delivery_status:ACCEPTD"}}]}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}
            ack_mtnnpontu3_res = es.search(index="prod-kannel-access-*", body=json_payload)
            ack_mtnnpontu3 = ack_mtnnpontu3_res['aggregations']['2']['buckets'][0]['doc_count']
            total_ack_mtnnpontu3 = format((ack_mtnnpontu3/mtnnpontu3_count) * 100, '.2f')
            logging.info(f"Total acknowledged mtnnpontu3:{total_ack_mtnnpontu3}")

        except Exception as e:
            logging.info(f'failed with error {e}')
            return make_response(jsonify(code=500, error='search failed'), 200)

        return make_response(jsonify(code=200, 
                                    total_count=mtnnpontu3_count, 
                                    total_delivered=total_delivrd_mtnnpontu3,
                                    total_undelivered=total_undelivrd_mtnnpontu3,
                                    total_expired=total_expired_mtnnpontu3,
                                    total_acknowledged=total_ack_mtnnpontu3))




@app.route('/sms/mtnnpontu/', methods=['POST', 'GET'])
@auth.login_required
def sms_mtnnpontu():
    es = Elasticsearch(str(elasticinfo["live"]))

    if request.method == 'POST':
        req = request.get_json()
        request_start_date = req['start_date']
        request_end_date = req['end_date']
        today = datetime.utcnow().date()

        
        if not request_start_date.strip() or not request_end_date.strip():
            request_start_date = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc())
            request_end_date = request_start_date + timedelta(days=1, microseconds=-1)
            request_start_date = request_start_date.isoformat()
            request_end_date = request_end_date.isoformat()
        else:
            request_start_date = parser.parse(req['start_date']).isoformat()
            request_end_date = parser.parse(req['end_date']).isoformat()
        

            
        try:                
            # total mtnnpontu
            json_payload = {
                "size":0,
                "query":{"bool":
                {"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnnpontu"}}]}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":0,"extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}
            mtnnpontu_res = es.search(index="prod-kannel-access-*", body=json_payload)
            mtnnpontu_count = mtnnpontu_res['aggregations']['2']['buckets'][0]['doc_count']
            logging.info(f"mtnnpontu count :{mtnnpontu_count}")

            # delivered mtnnpontu
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnnpontu"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:DELIVRD":{"query_string":{"query":"delivery_status:DELIVRD"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}
            delivrd_mtnnpontu_res = es.search(index="prod-kannel-access-*", body=json_payload)
            delivrd_mtnnpontu = delivrd_mtnnpontu_res['aggregations']['3']['buckets']['delivery_status:DELIVRD']['doc_count']
            total_delivrd_mtnnpontu = format((delivrd_mtnnpontu/mtnnpontu_count) * 100, '.2f')
            logging.info(f"total mtnnpontu deliverd:{total_delivrd_mtnnpontu}")

            # undelivered mtnnpontu
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnnpontu"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:UNDELIV":{"query_string":{"query":"delivery_status:UNDELIV"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}
            undelivrd_mtnnpontu_res = es.search(index="prod-kannel-access-*", body=json_payload)
            undelivrd_mtnnpontu = undelivrd_mtnnpontu_res['aggregations']['3']['buckets']['delivery_status:UNDELIV']['doc_count']
            total_undelivrd_mtnnpontu = format((undelivrd_mtnnpontu/mtnnpontu_count) * 100, '.2f')
            logging.info(f"total mtnnpontu undeliverd:{total_undelivrd_mtnnpontu}")

            # expired mtnnpontu
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnnpontu"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:EXPIRED":{"query_string":{"query":"delivery_status:EXPIRED"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}
            expired_mtnnpontu_res = es.search(index="prod-kannel-access-*", body=json_payload)
            expired_mtnnpontu = expired_mtnnpontu_res['aggregations']['3']['buckets']['delivery_status:EXPIRED']['doc_count']
            total_expired_mtnnpontu = format((expired_mtnnpontu/mtnnpontu_count) * 100, '.2f')
            logging.info(f"total mtnnpontu expired:{total_expired_mtnnpontu}")


            # acknowledged mtnnpontu
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:mtnnpontu AND NOT delivery_status:UNDELIV AND NOT delivery_status:DELIVRD AND NOT delivery_status:EXPIRED AND NOT delivery_status:REJECTD AND NOT delivery_status:undeliv AND NOT delivery_status:ENROUTE AND NOT delivery_status:ACCEPTD"}}]}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}
            ack_mtnnpontu_res = es.search(index="prod-kannel-access-*", body=json_payload)
            ack_mtnnpontu = ack_mtnnpontu_res['aggregations']['2']['buckets'][0]['doc_count']
            total_ack_mtnnpontu = format((ack_mtnnpontu/mtnnpontu_count) * 100, '.2f')
            logging.info(f"Total acknowledged mtnnpontu3:{total_ack_mtnnpontu}")

        except Exception as e:
            logging.info(f'failed with error {e}')
            return make_response(jsonify(code=500, error='search failed'), 200)

        return make_response(jsonify(code=200, 
                                    total_count=mtnnpontu_count, 
                                    total_delivered=total_delivrd_mtnnpontu,
                                    total_undelivered=total_undelivrd_mtnnpontu,
                                    total_expired=total_expired_mtnnpontu,
                                    total_acknowledged=total_ack_mtnnpontu))




@app.route('/sms/rsms/', methods=['POST', 'GET'])
@auth.login_required
def sms_rsms():
    es = Elasticsearch(str(elasticinfo["live"]))

    if request.method == 'POST':
        req = request.get_json()
        request_start_date = req['start_date']
        request_end_date = req['end_date']
        today = datetime.utcnow().date()

        
        if not request_start_date.strip() or not request_end_date.strip():
            request_start_date = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc())
            request_end_date = request_start_date + timedelta(days=1, microseconds=-1)
            request_start_date = request_start_date.isoformat()
            request_end_date = request_end_date.isoformat()
        else:
            request_start_date = parser.parse(req['start_date']).isoformat()
            request_end_date = parser.parse(req['end_date']).isoformat()
       
            
        try:                
            # total rsms
            json_payload = {
                "size":0,
                "query":{"bool":
                {"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:rsms"}}]}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":0,"extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}
            rsms_res = es.search(index="prod-kannel-access-*", body=json_payload)
            rsms_count = rsms_res['aggregations']['2']['buckets'][0]['doc_count']
            logging.info(f"rsms count :{rsms_count}")

            # delivered rsms
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:rsms"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:DELIVRD":{"query_string":{"query":"delivery_status:DELIVRD"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}
            delivrd_rsms_res = es.search(index="prod-kannel-access-*", body=json_payload)
            delivrd_rsms = delivrd_rsms_res['aggregations']['3']['buckets']['delivery_status:DELIVRD']['doc_count']
            total_delivrd_rsms = format((delivrd_rsms/rsms_count) * 100, '.2f')
            logging.info(f"total rsms deliverd:{total_delivrd_rsms}")

            # undelivered rsms
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:rsms"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:UNDELIV":{"query_string":{"query":"delivery_status:UNDELIV"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}
            undelivrd_rsms_res = es.search(index="prod-kannel-access-*", body=json_payload)
            undelivrd_rsms = undelivrd_rsms_res['aggregations']['3']['buckets']['delivery_status:UNDELIV']['doc_count']
            total_undelivrd_rsms = format((undelivrd_rsms/rsms_count) * 100, '.2f')
            logging.info(f"total rsms undeliverd:{total_undelivrd_rsms}")

            
            # expired rsms
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:rsms"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:EXPIRED":{"query_string":{"query":"delivery_status:EXPIRED"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}
            expired_rsms_res = es.search(index="prod-kannel-access-*", body=json_payload)
            expired_rsms = expired_rsms_res['aggregations']['3']['buckets']['delivery_status:EXPIRED']['doc_count']
            total_expired_rsms = format((expired_rsms/rsms_count) * 100, '.2f')
            logging.info(f"total rsms expired:{total_expired_rsms}")

            # acknowledged rsms
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:rsms AND NOT delivery_status:UNDELIV AND NOT delivery_status:DELIVRD AND NOT delivery_status:EXPIRED AND NOT delivery_status:REJECTD AND NOT delivery_status:undeliv AND NOT delivery_status:ENROUTE AND NOT delivery_status:ACCEPTD"}}]}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}
            ack_rsms_res = es.search(index="prod-kannel-access-*", body=json_payload)
            ack_rsms = ack_rsms_res['aggregations']['2']['buckets'][0]['doc_count']
            total_ack_rsms = format((ack_rsms/rsms_count) * 100, '.2f')
            logging.info(f"Total acknowledged rsms:{total_ack_rsms}")

        except Exception as e:
            logging.info(f'failed with error {e}')
            return make_response(jsonify(code=500, error='search failed'), 200)

        return make_response(jsonify(code=200, 
                                    total_count=rsms_count, 
                                    total_delivered=total_delivrd_rsms,
                                    total_undelivered=total_undelivrd_rsms,
                                    total_expired=total_expired_rsms,
                                    total_acknowledged=total_ack_rsms))





@app.route('/sms/vodafone/', methods=['POST', 'GET'])
@auth.login_required
def sms_vodafone():
    es = Elasticsearch(str(elasticinfo["live"]))

    if request.method == 'POST':
        req = request.get_json()
        request_start_date = req['start_date']
        request_end_date = req['end_date']
        today = datetime.utcnow().date()

        
        if not request_start_date.strip() or not request_end_date.strip():
            request_start_date = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc())
            request_end_date = request_start_date + timedelta(days=1, microseconds=-1)
            request_start_date = request_start_date.isoformat()
            request_end_date = request_end_date.isoformat()
        else:
            request_start_date = parser.parse(req['start_date']).isoformat()
            request_end_date = parser.parse(req['end_date']).isoformat()
       
            
        try:
            # total vodafone
            json_payload = {
                "size":0,
                "query":{"bool":
                {"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:vodafone3"}}]}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":0,"extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}
            vodafone_res = es.search(index="prod-kannel-access-*", body=json_payload)
            vodafone_count = vodafone_res['aggregations']['2']['buckets'][0]['doc_count']
            logging.info(f"vodafone count :{vodafone_count}")

            # delivered vodafone
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:vodafone3"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:DELIVRD":{"query_string":{"query":"delivery_status:DELIVRD"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}
            delivrd_vodafone_res = es.search(index="prod-kannel-access-*", body=json_payload)
            delivrd_vodafone = delivrd_vodafone_res['aggregations']['3']['buckets']['delivery_status:DELIVRD']['doc_count']
            total_delivrd_vodafone = format((delivrd_vodafone/vodafone_count) * 100, '.2f')
            logging.info(f"total vodafone deliverd:{total_delivrd_vodafone}")

            # undelivered vodafone
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:vodafone3"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:UNDELIV":{"query_string":{"query":"delivery_status:UNDELIV"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}
            undelivrd_vodafone_res = es.search(index="prod-kannel-access-*", body=json_payload)
            undelivrd_vodafone = undelivrd_vodafone_res['aggregations']['3']['buckets']['delivery_status:UNDELIV']['doc_count']
            total_undelivrd_vodafone = format((undelivrd_vodafone/vodafone_count) * 100, '.2f')
            logging.info(f"total vodafone undeliverd:{total_undelivrd_vodafone}")

             # expired vodafone
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:vodafone3"}}]}},
                "aggs":{"3":{"filters":{"filters":{"delivery_status:EXPIRED":{"query_string":{"query":"delivery_status:EXPIRED"}}}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}}}
            expired_vodafone_res = es.search(index="prod-kannel-access-*", body=json_payload)
            expired_vodafone = expired_vodafone_res['aggregations']['3']['buckets']['delivery_status:EXPIRED']['doc_count']
            total_expired_vodafone = format((expired_vodafone/vodafone_count) * 100, '.2f')
            logging.info(f"total vodafone expired:{total_expired_vodafone}")


            # acknowledged vodafone
            json_payload = {
                "size":0,
                "query":{"bool":{"filter":[{"range":{"submit_time":{"gte":"{}".format(request_start_date),"lte":"{}".format(request_end_date)}}},
                {"query_string":{"query":"operator_route:vodafone3 AND NOT delivery_status:UNDELIV AND NOT delivery_status:DELIVRD AND NOT delivery_status:EXPIRED AND NOT delivery_status:REJECTD AND NOT delivery_status:undeliv AND NOT delivery_status:ENROUTE AND NOT delivery_status:ACCEPTD"}}]}},
                "aggs":{"2":{"date_histogram":{"interval":"366d","field":"submit_time","min_doc_count":"0","extended_bounds":{"min":"{}".format(request_start_date),"max":"{}".format(request_end_date)}},
                "aggs":{}}}}
            ack_vodafone_res = es.search(index="prod-kannel-access-*", body=json_payload)
            ack_vodafone = ack_vodafone_res['aggregations']['2']['buckets'][0]['doc_count']
            total_ack_vodafone = format((ack_vodafone/vodafone_count) * 100, '.2f')
            logging.info(f"Total acknowledged vodafone:{total_ack_vodafone}")

        except Exception as e:
            logging.info(f'failed with error {e}')
            return make_response(jsonify(code=500, error='search failed'), 200)

        return make_response(jsonify(code=200, 
                                    total_count=vodafone_count, 
                                    total_delivered=total_delivrd_vodafone,
                                    total_undelivered=total_undelivrd_vodafone,
                                    total_expired=total_expired_vodafone,
                                    total_acknowledged=total_ack_vodafone))





if __name__ == '__main__':
    app.run(host='0.0.0.0')