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

logging.basicConfig(filename='/var/www/html/logs/bulk_sms_dlrs.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('/general/dlrs/', methods=['POST', 'GET'])
@auth.login_required
def generalDLR():
    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()

        logging.info(f'[start_date:{request_start_date}] [end_date:{request_end_date}]')
        try:    
            # DELIVRD           
            json_payload = {
                        "size": 0,
                        "query": {
                            "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}}]}
                        },
                        "aggs":{"2":{"filters":{"filters":{"status:DELIVRD":{"query_string":{"query":"status:DELIVRD"}}}}}}
                        }
            delivrd_res = es.search(index="deywuro-logs-*", body=json_payload)
            try: 
                total_delivrd = delivrd_res['aggregations']['2']['buckets']['status:DELIVRD']['doc_count']
            except:
                total_delivrd = 0
            logging.info(f"Total DELIVRD:{total_delivrd}")

            # UNDELIV          
            json_payload = {
                        "size": 0,
                        "query": {
                            "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}}]}
                        },
                        "aggs":{"2":{"filters":{"filters":{"status:UNDELIV":{"query_string":{"query":"status:UNDELIV"}}}}}}
                        }
            undeliv_res = es.search(index="deywuro-logs-*", body=json_payload)
            try: 
                total_undeliv = undeliv_res['aggregations']['2']['buckets']['status:UNDELIV']['doc_count']
            except:
                total_undeliv = 0
            logging.info(f"Total UNDELIV:{total_undeliv}")

            # ACK/         
            json_payload = {
                        "size": 0,
                        "query": {
                            "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}}]}
                        },
                        "aggs":{"2":{"filters":{"filters":{"status:ACK\\/":{"query_string":{"query":"status:ACK\\/"}}}}}}
                        }
            ack_res = es.search(index="deywuro-logs-*", body=json_payload)
            try: 
                total_ack = ack_res['aggregations']['2']['buckets']['status:ACK\\/']['doc_count']
            except:
                total_ack = 0
            logging.info(f"Total ACK/:{total_ack}")

            # EXPIRED          
            json_payload = {
                        "size": 0,
                        "query": {
                            "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}}]}
                        },
                        "aggs":{"2":{"filters":{"filters":{"status:EXPIRED":{"query_string":{"query":"status:EXPIRED"}}}}}}
                        }
            expired_res = es.search(index="deywuro-logs-*", body=json_payload)
            try: 
                total_expired = expired_res['aggregations']['2']['buckets']['status:EXPIRED']['doc_count']
            except:
                total_expired = 0
            logging.info(f"Total EXPIRED:{total_expired}")

            # FAILED         
            json_payload = {
                        "size": 0,
                        "query": {
                            "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}}]}
                        },
                        "aggs":{"2":{"filters":{"filters":{"status:FAILED":{"query_string":{"query":"status:FAILED"}}}}}}
                        }
            failed_res = es.search(index="deywuro-logs-*", body=json_payload)
            try: 
                total_failed = failed_res['aggregations']['2']['buckets']['status:FAILED']['doc_count']
            except:
                total_failed = 0
            logging.info(f"Total FAILED:{total_failed}")

            # REJECTD         
            json_payload = {
                        "size": 0,
                        "query": {
                            "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}}]}
                        },
                        "aggs":{"2":{"filters":{"filters":{"status:REJECTD":{"query_string":{"query":"status:REJECTD"}}}}}}
                        }
            rejectd_res = es.search(index="deywuro-logs-*", body=json_payload)
            try: 
                total_rejectd = rejectd_res['aggregations']['2']['buckets']['status:REJECTD']['doc_count']
            except:
                total_rejectd = 0
            logging.info(f"Total FAILED:{total_rejectd}")

             # PENDING        
            json_payload = {
                        "size": 0,
                        "query": {
                            "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}}]}
                        },
                        "aggs":{"2":{"filters":{"filters":{"status:PENDING":{"query_string":{"query":"status:PENDING"}}}}}}
                        }
            pending_res = es.search(index="deywuro-logs-*", body=json_payload)
            try: 
                total_pending = pending_res['aggregations']['2']['buckets']['status:PENDING']['doc_count']
            except:
                total_pending = 0
            logging.info(f"Total FAILED:{total_pending}")

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

        return make_response(jsonify(code=200, 
                                    total_delivrd=total_delivrd,
                                    total_undeliv=total_undeliv,
                                    total_ack=total_ack,
                                    total_expired=total_expired,
                                    total_failed=total_failed,
                                    total_rejectd=total_rejectd,
                                    total_pending=total_pending))




# user breakdown by dlrs
@app.route('/user/dlrs/', methods=['POST', 'GET'])
@auth.login_required
def userDLR():
    es = Elasticsearch(str(elasticinfo["live"]))

    if request.method == 'POST':
        req = request.get_json()
        username = str(req['username'])
        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()


        logging.info(f'[username:{username}] [start_date:{request_start_date}] [end_date:{request_end_date}]')
        try:                  
            
            # DELIVRD           
            json_payload = {
                        "size": 0,
                        "query": {
                            "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}},
                            {"match": {"username.keyword":username}}
                            ]}
                        },
                        "aggs":{"2":{"filters":{"filters":{"status:DELIVRD":{"query_string":{"query":"status:DELIVRD"}}}}}}
                        }
            delivrd_res = es.search(index="deywuro-logs-*", body=json_payload)
            try: 
                total_delivrd = delivrd_res['aggregations']['2']['buckets']['status:DELIVRD']['doc_count']
            except:
                total_delivrd = 0
            logging.info(f"Total DELIVRD:{total_delivrd}")

            
            # UNDELIV          
            json_payload = {
                        "size": 0,
                        "query": {
                            "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}},
                            {"match": {"username.keyword":username}}
                            ]}
                        },
                        "aggs":{"2":{"filters":{"filters":{"status:UNDELIV":{"query_string":{"query":"status:UNDELIV"}}}}}}
                        }
            undeliv_res = es.search(index="deywuro-logs-*", body=json_payload)
            try: 
                total_undeliv = undeliv_res['aggregations']['2']['buckets']['status:UNDELIV']['doc_count']
            except:
                total_undeliv = 0
            logging.info(f"Total UNDELIV:{total_undeliv}")

            
            # ACK/         
            json_payload = {
                        "size": 0,
                        "query": {
                            "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}},
                            {"match": {"username.keyword":username}}
                            ]}
                        },
                        "aggs":{"2":{"filters":{"filters":{"status:ACK\\/":{"query_string":{"query":"status:ACK\\/"}}}}}}
                        }
            ack_res = es.search(index="deywuro-logs-*", body=json_payload)
            try: 
                total_ack = ack_res['aggregations']['2']['buckets']['status:ACK\\/']['doc_count']
            except:
                total_ack = 0
            logging.info(f"Total ACK/:{total_ack}")

            
            # EXPIRED          
            json_payload = {
                        "size": 0,
                        "query": {
                            "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}},
                            {"match": {"username.keyword":username}}
                            ]}
                        },
                        "aggs":{"2":{"filters":{"filters":{"status:EXPIRED":{"query_string":{"query":"status:EXPIRED"}}}}}}
                        }
            expired_res = es.search(index="deywuro-logs-*", body=json_payload)
            try: 
                total_expired = expired_res['aggregations']['2']['buckets']['status:EXPIRED']['doc_count']
            except:
                total_expired = 0
            logging.info(f"Total EXPIRED:{total_expired}")

           
            # FAILED         
            json_payload = {
                        "size": 0,
                        "query": {
                            "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}},
                            {"match": {"username.keyword":username}}
                            ]}
                        },
                        "aggs":{"2":{"filters":{"filters":{"status:FAILED":{"query_string":{"query":"status:FAILED"}}}}}}
                        }
            failed_res = es.search(index="deywuro-logs-*", body=json_payload)
            try: 
                total_failed = failed_res['aggregations']['2']['buckets']['status:FAILED']['doc_count']
            except:
                total_failed = 0
            logging.info(f"Total FAILED:{total_failed}")

            
            # REJECTD         
            json_payload = {
                        "size": 0,
                        "query": {
                            "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}},
                            {"match": {"username.keyword":username}}
                            ]}
                        },
                        "aggs":{"2":{"filters":{"filters":{"status:REJECTD":{"query_string":{"query":"status:REJECTD"}}}}}}
                        }
            rejectd_res = es.search(index="deywuro-logs-*", body=json_payload)
            try: 
                total_rejectd = rejectd_res['aggregations']['2']['buckets']['status:REJECTD']['doc_count']
            except:
                total_rejectd = 0
            logging.info(f"Total FAILED:{total_rejectd}")

            
            # PENDING        
            json_payload = {
                        "size": 0,
                        "query": {
                            "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}},
                            {"match": {"username.keyword":username}}
                            ]}
                        },
                        "aggs":{"2":{"filters":{"filters":{"status:PENDING":{"query_string":{"query":"status:PENDING"}}}}}}
                        }
            pending_res = es.search(index="deywuro-logs-*", body=json_payload)
            try: 
                total_pending = pending_res['aggregations']['2']['buckets']['status:PENDING']['doc_count']
            except:
                total_pending = 0
            logging.info(f"Total FAILED:{total_pending}")

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


        return make_response(jsonify(code=200, 
                                    total_delivrd=total_delivrd,
                                    total_undeliv=total_undeliv,
                                    total_ack=total_ack,
                                    total_expired=total_expired,
                                    total_failed=total_failed,
                                    total_rejectd=total_rejectd,
                                    total_pending=total_pending))



# user monthly sms breakdown
@app.route('/user/sms-monthly/', methods=['POST', 'GET'])
@auth.login_required
def userSmsMonthly():
    es = Elasticsearch(str(elasticinfo["live"]))

    if request.method == 'POST':
        req = request.get_json()
        username = str(req['username'])
        if not str(req['current_year']).strip():
            current_year = datetime.utcnow().date().year
        else:
            current_year = int(req['current_year'])
        results = {}
        months = {
            1  : 'Jan',
            2  : 'Feb',
            3  : 'Mar',
            4  : 'Apr',
            5  : 'May',
            6  : 'Jun',
            7  : 'Jul',
            8  : 'Aug',
            9  : 'Sep',
            10 : 'Oct',
            11 : 'Nov',
            12 : 'Dec'
        }

        for i in range(1, 13):
            request_start_date = f"{current_year}-{'%02d'%i}-01T00:00:00"
            end_of_month = calendar.monthrange(current_year, i)[1]
            request_end_date = f"{current_year}-{'%02d'%i}-{'%02d'%end_of_month}T23:59:59"
            request_start_date = parser.parse(request_start_date).isoformat()
            request_end_date = parser.parse(request_end_date).isoformat()
            logging.info(f'[username:{username}] [start_of_month:{request_start_date}] [end_of_month:{request_end_date}]')
            try:                              
                # DELIVRD           
                json_payload = {
                            "size": 0,
                            "query": {
                                "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}},
                                {"match": {"username.keyword":username}}
                                ]}
                            },
                            "aggs":{"2":{"filters":{"filters":{"status:DELIVRD":{"query_string":{"query":"status:DELIVRD"}}}}}}
                            }
                delivrd_res = es.search(index="deywuro-logs-*", body=json_payload)
                try: 
                    total_delivrd = delivrd_res['aggregations']['2']['buckets']['status:DELIVRD']['doc_count']
                except:
                    total_delivrd = 0
                logging.info(f"Total DELIVRD:{total_delivrd}")

                
                # UNDELIV          
                json_payload = {
                            "size": 0,
                            "query": {
                                "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}},
                                {"match": {"username.keyword":username}}
                                ]}
                            },
                            "aggs":{"2":{"filters":{"filters":{"status:UNDELIV":{"query_string":{"query":"status:UNDELIV"}}}}}}
                            }
                undeliv_res = es.search(index="deywuro-logs-*", body=json_payload)
                try: 
                    total_undeliv = undeliv_res['aggregations']['2']['buckets']['status:UNDELIV']['doc_count']
                except:
                    total_undeliv = 0
                logging.info(f"Total UNDELIV:{total_undeliv}")

                
                # ACK/         
                json_payload = {
                            "size": 0,
                            "query": {
                                "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}},
                                {"match": {"username.keyword":username}}
                                ]}
                            },
                            "aggs":{"2":{"filters":{"filters":{"status:ACK\\/":{"query_string":{"query":"status:ACK\\/"}}}}}}
                            }
                ack_res = es.search(index="deywuro-logs-*", body=json_payload)
                try: 
                    total_ack = ack_res['aggregations']['2']['buckets']['status:ACK\\/']['doc_count']
                except:
                    total_ack = 0
                logging.info(f"Total ACK/:{total_ack}")

                
                # EXPIRED          
                json_payload = {
                            "size": 0,
                            "query": {
                                "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}},
                                {"match": {"username.keyword":username}}
                                ]}
                            },
                            "aggs":{"2":{"filters":{"filters":{"status:EXPIRED":{"query_string":{"query":"status:EXPIRED"}}}}}}
                            }
                expired_res = es.search(index="deywuro-logs-*", body=json_payload)
                try: 
                    total_expired = expired_res['aggregations']['2']['buckets']['status:EXPIRED']['doc_count']
                except:
                    total_expired = 0
                logging.info(f"Total EXPIRED:{total_expired}")

            
                # FAILED         
                json_payload = {
                            "size": 0,
                            "query": {
                                "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}},
                                {"match": {"username.keyword":username}}
                                ]}
                            },
                            "aggs":{"2":{"filters":{"filters":{"status:FAILED":{"query_string":{"query":"status:FAILED"}}}}}}
                            }
                failed_res = es.search(index="deywuro-logs-*", body=json_payload)
                try: 
                    total_failed = failed_res['aggregations']['2']['buckets']['status:FAILED']['doc_count']
                except:
                    total_failed = 0
                logging.info(f"Total FAILED:{total_failed}")

                
                # REJECTD         
                json_payload = {
                            "size": 0,
                            "query": {
                                "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}},
                                {"match": {"username.keyword":username}}
                                ]}
                            },
                            "aggs":{"2":{"filters":{"filters":{"status:REJECTD":{"query_string":{"query":"status:REJECTD"}}}}}}
                            }
                rejectd_res = es.search(index="deywuro-logs-*", body=json_payload)
                try: 
                    total_rejectd = rejectd_res['aggregations']['2']['buckets']['status:REJECTD']['doc_count']
                except:
                    total_rejectd = 0
                logging.info(f"Total FAILED:{total_rejectd}")

                
                # PENDING        
                json_payload = {
                            "size": 0,
                            "query": {
                                "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}},
                                {"match": {"username.keyword":username}}
                                ]}
                            },
                            "aggs":{"2":{"filters":{"filters":{"status:PENDING":{"query_string":{"query":"status:PENDING"}}}}}}
                            }
                pending_res = es.search(index="deywuro-logs-*", body=json_payload)
                try: 
                    total_pending = pending_res['aggregations']['2']['buckets']['status:PENDING']['doc_count']
                except:
                    total_pending = 0
                logging.info(f"Total FAILED:{total_pending}")

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

            if not months[i] in results.keys():
                results[months[i]] = dict(
                                    total_delivrd=total_delivrd,
                                    total_undeliv=total_undeliv,
                                    total_ack=total_ack,
                                    total_expired=total_expired,
                                    total_failed=total_failed,
                                    total_rejectd=total_rejectd,
                                    total_pending=total_pending
                                    )

        return make_response(jsonify(code=200, data=results))




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

    if request.method == 'GET':
        req = request.get_json()
        if not str(req['current_year']).strip():
            current_year = datetime.utcnow().date().year
        else:
            current_year = int(req['current_year'])
        results = {}
        months = {
            1  : 'Jan',
            2  : 'Feb',
            3  : 'Mar',
            4  : 'Apr',
            5  : 'May',
            6  : 'Jun',
            7  : 'Jul',
            8  : 'Aug',
            9  : 'Sep',
            10 : 'Oct',
            11 : 'Nov',
            12 : 'Dec'
        }

        for i in range(1, 13):
            request_start_date = f"{current_year}-{'%02d'%i}-01T00:00:00"
            end_of_month = calendar.monthrange(current_year, i)[1]
            request_end_date = f"{current_year}-{'%02d'%i}-{'%02d'%end_of_month}T23:59:59"
            request_start_date = parser.parse(request_start_date).isoformat()
            request_end_date = parser.parse(request_end_date).isoformat()
            logging.info(f'[start_of_month:{request_start_date}] [end_of_month:{request_end_date}]')
            try:                              
                # DELIVRD           
                json_payload = {
                            "size": 0,
                            "query": {
                                "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}}
                                ]}
                            },
                            "aggs":{"2":{"filters":{"filters":{"status:DELIVRD":{"query_string":{"query":"status:DELIVRD"}}}}}}
                            }
                delivrd_res = es.search(index="deywuro-logs-*", body=json_payload)
                try: 
                    total_delivrd = delivrd_res['aggregations']['2']['buckets']['status:DELIVRD']['doc_count']
                except:
                    total_delivrd = 0
                logging.info(f"Total DELIVRD:{total_delivrd}")

                
                # UNDELIV          
                json_payload = {
                            "size": 0,
                            "query": {
                                "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}}
                                ]}
                            },
                            "aggs":{"2":{"filters":{"filters":{"status:UNDELIV":{"query_string":{"query":"status:UNDELIV"}}}}}}
                            }
                undeliv_res = es.search(index="deywuro-logs-*", body=json_payload)
                try: 
                    total_undeliv = undeliv_res['aggregations']['2']['buckets']['status:UNDELIV']['doc_count']
                except:
                    total_undeliv = 0
                logging.info(f"Total UNDELIV:{total_undeliv}")

                
                # ACK/         
                json_payload = {
                            "size": 0,
                            "query": {
                                "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}}
                                ]}
                            },
                            "aggs":{"2":{"filters":{"filters":{"status:ACK\\/":{"query_string":{"query":"status:ACK\\/"}}}}}}
                            }
                ack_res = es.search(index="deywuro-logs-*", body=json_payload)
                try: 
                    total_ack = ack_res['aggregations']['2']['buckets']['status:ACK\\/']['doc_count']
                except:
                    total_ack = 0
                logging.info(f"Total ACK/:{total_ack}")

                
                # EXPIRED          
                json_payload = {
                            "size": 0,
                            "query": {
                                "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}}
                                ]}
                            },
                            "aggs":{"2":{"filters":{"filters":{"status:EXPIRED":{"query_string":{"query":"status:EXPIRED"}}}}}}
                            }
                expired_res = es.search(index="deywuro-logs-*", body=json_payload)
                try: 
                    total_expired = expired_res['aggregations']['2']['buckets']['status:EXPIRED']['doc_count']
                except:
                    total_expired = 0
                logging.info(f"Total EXPIRED:{total_expired}")

            
                # FAILED         
                json_payload = {
                            "size": 0,
                            "query": {
                                "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}}
                                ]}
                            },
                            "aggs":{"2":{"filters":{"filters":{"status:FAILED":{"query_string":{"query":"status:FAILED"}}}}}}
                            }
                failed_res = es.search(index="deywuro-logs-*", body=json_payload)
                try: 
                    total_failed = failed_res['aggregations']['2']['buckets']['status:FAILED']['doc_count']
                except:
                    total_failed = 0
                logging.info(f"Total FAILED:{total_failed}")

                
                # REJECTD         
                json_payload = {
                            "size": 0,
                            "query": {
                                "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}}
                                ]}
                            },
                            "aggs":{"2":{"filters":{"filters":{"status:REJECTD":{"query_string":{"query":"status:REJECTD"}}}}}}
                            }
                rejectd_res = es.search(index="deywuro-logs-*", body=json_payload)
                try: 
                    total_rejectd = rejectd_res['aggregations']['2']['buckets']['status:REJECTD']['doc_count']
                except:
                    total_rejectd = 0
                logging.info(f"Total FAILED:{total_rejectd}")

                
                # PENDING        
                json_payload = {
                            "size": 0,
                            "query": {
                                "bool":{"filter":[{"range":{"submit_date":{"gte":"{}".format(request_start_date), "lt":"{}".format(request_end_date)}}}
                                ]}
                            },
                            "aggs":{"2":{"filters":{"filters":{"status:PENDING":{"query_string":{"query":"status:PENDING"}}}}}}
                            }
                pending_res = es.search(index="deywuro-logs-*", body=json_payload)
                try: 
                    total_pending = pending_res['aggregations']['2']['buckets']['status:PENDING']['doc_count']
                except:
                    total_pending = 0
                logging.info(f"Total FAILED:{total_pending}")

                    
            except Exception as e:
                logging.info(f"search api failed with error {e}")
                return make_response(jsonify(code=500, error='search failed'), 200)
                
            if not months[i] in results.keys():
                results[months[i]] = dict(
                                    total_delivrd=total_delivrd,
                                    total_undeliv=total_undeliv,
                                    total_ack=total_ack,
                                    total_expired=total_expired,
                                    total_failed=total_failed,
                                    total_rejectd=total_rejectd,
                                    total_pending=total_pending
                                    )

        return make_response(jsonify(code=200, data=results))





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