from flask_restful import Resource, reqparse
from flask import jsonify, render_template, make_response
from app import db
import requests
import datetime
import constants as const
import html_strings as temp
import calendar


from flask_restful import Resource, reqparse
from flask import jsonify, render_template, make_response
from app import db
import requests
import datetime
import constants as const
import html_strings as temp
import calendar
import random


class Report(Resource):
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('account_number')
        # parser.add_argument("start_date", default=datetime.date.today().strftime('%Y-%m-%d'))
        # parser.add_argument("end_date", default=datetime.date.today().strftime('%Y-%m-%d'))
        parser.add_argument("start_date")
        parser.add_argument("end_date")
        parser.add_argument('call_direction', default=0)
        args = parser.parse_args()
        account_number = args['account_number']
        start_date = args['start_date']
        end_date = args['end_date']
        call_direction = args['call_direction']
        connection = db.engine.raw_connection()
        def twoDecimalPoint(a):
            return str("%.2f" % float(a))
        def get_active_accounts():
            account_list = []
            active_accounts = db.session.execute(const.SQL_ACTIVE_ACCOUNT)
            for acc in active_accounts:
                account_list.append(acc[0])
            return account_list
        def get_did_and_package_info():
            total=0
            html =""
            extensionCount=0
            amount=0
            planAmount=0
            freeExtension=0
            try:
                cursor = connection.cursor()
                cursor.callproc("invoice", [account_number])
                html='<table id= "inbound_tab" align = center width = "100%"> \
				<tr> \
				<th colspan="3">Number Details</th> \
				</tr><tr>'
                while True:
                    if cursor.rowcount:
                        case_details = cursor.fetchall()
                        for data in case_details:
                            print("poinnnnn")
                            print(str(data[0]))
                            print(str(data[1]))
                            if data[0] == 'did_number':
                                html=html+'<tr> \
				                <td>'+ str (data[1])+'</td><td>&pound;'+ twoDecimalPoint (data[2])+'</td> \
				                </tr>'
                                print("1")
                                print(data[2])
                                total=float(total)+float(data[2])
                                print("2")
                            elif data[0] == 'extension':
                               extensionCount=int(data[1])
                            elif data[0] == 'package':
                                freeExtension=int(data[1])
                                amount=float(data[2])
                                planAmount=float(data[3])


                    if not cursor.nextset():
                        break
            except Exception as e:
                print("Exception")
                print(str(e))
            finally:
                cursor.close()
                # connection.close()
            html=html+'<tr> <td \
                style = " text-align:right;" > <b>Number Total \
                </b> </td><td style = "text-align:right;" >  \
                <b> &pound;'+twoDecimalPoint(total)+' </b></td></tr> '
            html=html+'<tr> \
				<th colspan="3">Plan Details</th> \
				</tr><tr>' +'<tr> \
				<td>Plan Amount</td><td>&pound;'+ twoDecimalPoint(planAmount)+'</td> \
				</tr>'
            html = html + '<tr> <td \
                            style = " text-align:right;" > <b>Plan Total \
                            </b> </td><td style = "text-align:right;" >  \
                            <b> &pound;' + twoDecimalPoint(planAmount) + ' </b></td></tr> '
            total+=planAmount
            total += ((extensionCount-freeExtension)*amount)
            html = html + '<tr> \
            				<th colspan="3">Seat</th> \
            				</tr><tr>' + '<tr> \
            				<td>Seat('+str(extensionCount-freeExtension)+'*&pound;'+twoDecimalPoint(amount)+')</td><td>&pound;' +twoDecimalPoint ((extensionCount-freeExtension)*amount) + '</td> \
            				</tr>'
            html = html + '<tr> <td \
                            style = " text-align:right;" > <b>Seat Total \
                            </b> </td><td style = "text-align:right;" >  \
                            <b> &pound;' + twoDecimalPoint ((extensionCount-freeExtension)*amount)+ ' </b></td></tr> '
            html = html + '</table>'
            return [html,total]

        def send_invoice_to_email():
            return None

        def generate_random_num(n):
            otp = ""
            for i in range(0, n):
                num = random.randint(1, 9)
                otp += str(num)
            return otp

        today = datetime.date.today()
        print(today)
        first = today.replace(day=1)
        last_month_year = first - datetime.timedelta(days=1)
        last_y = last_month_year.strftime("%Y")
        last_m = last_month_year.strftime("%m")
        # print(lastMonth.strftime("%Y-%m"))
        # print(last_m, last_y)
        # print(calendar.monthrange(int(last_y), int(last_m))[1])

        if not start_date or start_date == "":
            print("start date if")
            start_date = str(last_y) + '-' + str(last_m) + '-01'
            # start_date = datetime.datetime.strptime(start_date_str, '%Y-%m-%d')
        if not end_date or end_date == "":
            print("end date if")
            end_date = str(last_y) + '-' + str(last_m) + '-' + str(calendar.monthrange(int(last_y), int(last_m))[1])
            # end_date = datetime.datetime.strptime(end_date_str, '%Y-%m-%d')

        print(start_date + ' ' + end_date)
        # return jsonify(status=1, result='', messsage=str(start_date_str) + ' ' + str(end_date_str))


        call_report_data = {}
        active_accounts_list = []

        if account_number and account_number != "":
            active_accounts_list.append(account_number)
            # return jsonify(status=1, result='', messsage='Fetch single account')
        else:
            # Fetch all active accounts
            # active_accounts_list = get_active_accounts()
            active_accounts_list.append("400034")
            active_accounts_list.append("400015")
            active_accounts_list.append("400641")
            # return jsonify(status=1, result='', messsage='Fetch all active accounts')

        print(active_accounts_list)

        for accounts in active_accounts_list:
            print(accounts)
            # Procedure call to get call report
            try:
                cursor = connection.cursor()
                cursor.callproc('call_report', [accounts, start_date, end_date])
                call_details = cursor.fetchall()
                cursor.close()

                for (account_num, name, email, total_duration, inbound_duration, inbound_call_count, inbound_answered_count,
                     inbound_cost, outbound_duration, outbound_call_count, outbound_answered_count, outbound_cost) \
                        in call_details:
                    call_report_data = {
                        "account_number": int(account_num),
                        "account_name": str(name),
                        "email": str(email),
                        "inbound_total": int(inbound_call_count),
                        "inbound_answered": int(inbound_answered_count),
                        "inbound_duration": round(float(inbound_duration), 2),
                        "inbound_cost": round(float(inbound_cost), 2),
                        "outbound_total": int(outbound_call_count),
                        "outbound_answered": int(outbound_answered_count),
                        "outbound_duration": round(float(outbound_duration), 2),
                        "outbound_cost": round(float(outbound_cost), 2)
                    }
            except Exception as e:
                print(str(e))

            call_report_data['invoice_date'] = str(datetime.date.today().strftime('%Y-%m-%d'))
            call_report_data['invoice_period'] = str(start_date) + ' - ' + str(end_date)
            call_report_data['invoice_number'] = 'Q#' + str(datetime.date.today().strftime('%Y-%m-%d')) \
                                                 + '#' + str(generate_random_num(4))
            call_report_data['invoice_total'] = round(call_report_data['inbound_cost'] + call_report_data['outbound_cost'], 2)
            call_report_data['in_visibility'] = 'display:table;'
            call_report_data['out_visibility'] = 'display:table;'
            file_name = accounts + '_' + call_report_data['invoice_date'] + '_' + datetime.datetime.today().strftime('%H-%M-%S') + '.pdf'

            # if call_direction == 1:
            #     call_report_data['out_visibility'] = 'display:none;'
            # elif call_direction == 2:
            #     call_report_data['in_visibility'] = 'display:none;'

            if call_report_data['inbound_cost'] > 0 or call_report_data['outbound_cost'] > 0:

                # Get HTML Template string
                data = temp.TEMPLATE_INVOICE

                for key, value in call_report_data.items():
                    data = data.replace('{' + str(key) + '}', str(value))
                numberInfo=get_did_and_package_info()
                data = data.replace('{did_and_plan}', str(numberInfo[0]))
                total=numberInfo[1]
                vatAmount=float(total)*.2
                newTotal=total+vatAmount
                totalHtml='<tr> <td \
                style = " text-align:right;" > <b>Prepaid Amount  \
                </b> </td><td style = "text-align:right;" >  \
                <b>- &pound;'+twoDecimalPoint(inbound_cost+outbound_cost)+' </b></td></tr> <tr> <td \
                style = " text-align:right;" > <b>Monthly Sub Total \
                </b> </td><td style = "text-align:right;" >  \
                <b> &pound;'+twoDecimalPoint(total)+' </b></td></tr> \
                <tr> <td style = " text-align:right;" > <b>Vat(20%) \
                                </b> </td><td style = "text-align:right;" > <b> &pound; \
                               ' + twoDecimalPoint(vatAmount) + ' </b></td></tr> \
                <tr> <td style = "background-color:#303030; color:#fedb00; font-size:24px; text-align:right;" > <b>Grand Total \
                                                </b> </td><td style = "background-color:#303030; color:#fedb00; font-size:24px; text-align:right;" > <b> &pound; \
                                               ' + twoDecimalPoint(newTotal) + ' </b></td></tr>'
                data = data.replace('{total_with_vat}', str(totalHtml))
                # return data

                # HTML to PDF conversion
                response = requests.post(
                    "http://sampleapi.quiits.com/api/v1/generate_pdf_from_html",
                    json={
                        "html": data,
                        "file_name": file_name
                    },
                    headers={
                        'Content-Type': 'application/json'
                    }
                )

                # print(response.json()['result'])

                # Email the invoice
                # send_invoice_to_email(call_report_data['email'])

            # return make_response(jsonify(status=1, result=''), 200)
            return jsonify(status=1, message='Success', result={"pdf_link": "https://api.quiits.com/templates/" + file_name})
          

class ReportDetailed(Resource):
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('account_number')
        # parser.add_argument("start_date", default=datetime.date.today().strftime('%Y-%m-%d'))
        # parser.add_argument("end_date", default=datetime.date.today().strftime('%Y-%m-%d'))
        parser.add_argument("start_date")
        parser.add_argument("end_date")
        parser.add_argument('call_direction', default=0)
        args = parser.parse_args()
        account_number = args['account_number']
        start_date = args['start_date']
        end_date = args['end_date']
        call_direction = args['call_direction']
        connection = db.engine.raw_connection()

        def twoDecimalPoint(a):
            return str("%.2f" % float(a))

        def get_active_accounts():
            account_list = []
            active_accounts = db.session.execute(const.SQL_ACTIVE_ACCOUNT)
            for acc in active_accounts:
                account_list.append(acc[0])
            return account_list

        def get_did_and_package_info():
            total = 0
            html = ""
            extensionCount = 0
            amount = 0
            planAmount = 0
            freeExtension = 0
            planName =''
            number_total = 0
            
            try:
                cursor = connection.cursor()
                cursor.callproc("invoice", [account_number])
                html ='<table id= "inbound_tab" align = center width = "100%">'
                number_html = '<tr> \
				<th colspan="3">Number Details</th> \
				</tr><tr>'

                while True:
                    if cursor.rowcount:
                        case_details = cursor.fetchall()
                        for data in case_details:
                            print("poinnnnn")
                            print(str(data[0]))
                            print(str(data[1]))
                            if data[0] == 'did_number':
                                number_html = number_html+'<tr> \
				                <td>'+ str (data[1])+'</td><td>&pound;'+ twoDecimalPoint (data[2])+'</td> \
				                </tr>'
                                print("1")
                                print(data[2])
                                total = float(total)+float(data[2])
                                number_total = float(number_total)+float(data[2])
                                print("2")
                            elif data[0] == 'extension':
                                extensionCount = int(data[1])
                            elif data[0] == 'package':
                                freeExtension=int(data[1])
                                amount = float(data[2])
                                planAmount = float(data[3])
                                planName = str(data[4])
                                print(str(planName))

                    if not cursor.nextset():
                        break
            except Exception as e:
                print("Exception")
                print(str(e))
            finally:
                cursor.close()
                # connection.close()

            html = html+'<tr> \
				<th colspan="3">Your Plan - ' + str(planName) +'</th> \
				</tr><tr>' +'<tr> \
				<td>Plan Amount</td><td>&pound;'+ twoDecimalPoint(planAmount)+'</td> \
				</tr>'
            html = html + '<tr> <td \
                            style = " text-align:right;" > <b>Plan Total \
                            </b> </td><td style = "text-align:right;" >  \
                            <b> &pound;' + twoDecimalPoint(planAmount) + ' </b></td></tr> '

            total += planAmount
            total += ((extensionCount-freeExtension)*amount)
            html = html + '<tr> \
            				<th colspan="3">Seat</th> \
            				</tr><tr>' + '<tr> \
            				<td>Seat('+str(extensionCount-freeExtension)+'*&pound;'+twoDecimalPoint(amount)+')</td><td>&pound;' +twoDecimalPoint ((extensionCount-freeExtension)*amount) + '</td> \
            				</tr>'
            html = html + '<tr> <td \
                            style = " text-align:right;" > <b>Seat Total \
                            </b> </td><td style = "text-align:right;" >  \
                            <b> &pound;' + twoDecimalPoint((extensionCount-freeExtension)*amount) + ' </b></td></tr> '

            html = html + number_html
            html = html+'<tr> <td \
                style = " text-align:right;" > <b>Number Total \
                </b> </td><td style = "text-align:right;" >  \
                <b> &pound;' + twoDecimalPoint(number_total) +' </b></td></tr> '

            html = html + '</table>'
            return [html, total]

        def send_invoice_to_email():
            return None

        def generate_random_num(n):
            otp = ""
            for i in range(0, n):
                num = random.randint(1, 9)
                otp += str(num)
            return otp

        today = datetime.date.today()
        print(today)
        first = today.replace(day=1)
        last_month_year = first - datetime.timedelta(days=1)
        last_y = last_month_year.strftime("%Y")
        last_m = last_month_year.strftime("%m")
        # print(lastMonth.strftime("%Y-%m"))
        # print(last_m, last_y)
        # print(calendar.monthrange(int(last_y), int(last_m))[1])

        if not start_date or start_date == "":
            print("start date if")
            start_date = str(last_y) + '-' + str(last_m) + '-01'
            # start_date = datetime.datetime.strptime(start_date_str, '%Y-%m-%d')
        if not end_date or end_date == "":
            print("end date if")
            end_date = str(last_y) + '-' + str(last_m) + '-' + str(calendar.monthrange(int(last_y), int(last_m))[1])
            # end_date = datetime.datetime.strptime(end_date_str, '%Y-%m-%d')

        print(start_date + ' ' + end_date)
        # return jsonify(status=1, result='', messsage=str(start_date_str) + ' ' + str(end_date_str))

        call_report_data = {}
        active_accounts_list = []

        if account_number and account_number != "":
            active_accounts_list.append(account_number)
            # return jsonify(status=1, result='', messsage='Fetch single account')
        else:
            # Fetch all active accounts
            # active_accounts_list = get_active_accounts()
            active_accounts_list.append("400034")
            active_accounts_list.append("400015")
            active_accounts_list.append("400641")
            # return jsonify(status=1, result='', messsage='Fetch all active accounts')

        print(active_accounts_list)

        for accounts in active_accounts_list:
            print(accounts)
            # Procedure call to get call report
            try:
                cursor = connection.cursor()
                cursor.callproc('call_report', [accounts, start_date, end_date])
                call_details = cursor.fetchall()
                cursor.close()

                for (account_num, name, email, total_duration, inbound_duration, inbound_call_count, inbound_answered_count,
                     inbound_cost, outbound_duration, outbound_call_count, outbound_answered_count, outbound_cost) \
                        in call_details:
                    call_report_data = {
                        "account_number": int(account_num),
                        "account_name": str(name),
                        "email": str(email),
                        "inbound_total": int(inbound_call_count),
                        "inbound_answered": int(inbound_answered_count),
                        "inbound_duration": round(float(inbound_duration), 2),
                        "inbound_cost": twoDecimalPoint(round(float(inbound_cost), 2)),
                        "outbound_total": int(outbound_call_count),
                        "outbound_answered": int(outbound_answered_count),
                        "outbound_duration": round(float(outbound_duration), 2),
                        "outbound_cost": twoDecimalPoint(round(float(outbound_cost), 2))
                    }
            except Exception as e:
                print(str(e))

            call_report_data['invoice_date'] = str(datetime.date.today().strftime('%Y-%m-%d'))
            call_report_data['invoice_period'] = str(start_date) + ' - ' + str(end_date)
            # call_report_data['invoice_number'] = 'Q#' + str(datetime.date.today().strftime('%Y-%m-%d')) \
            #                                      + '#' + str(generate_random_num(4))
            call_report_data['invoice_number'] = 'Q#' + str(call_report_data['account_number']) \
                                                 + '#' + str(end_date)
            call_report_data['invoice_total'] = float(call_report_data['inbound_cost']) + float(call_report_data['outbound_cost'])
            call_report_data['invoice_total'] = twoDecimalPoint(call_report_data['invoice_total'])
            call_report_data['in_visibility'] = 'display:table;'
            call_report_data['out_visibility'] = 'display:table;'
            file_name = accounts + '_' + call_report_data['invoice_date'] + '_' + datetime.datetime.today().strftime('%H-%M-%S') + '.pdf'

            # if call_direction == 1:
            #     call_report_data['out_visibility'] = 'display:none;'
            # elif call_direction == 2:
            #     call_report_data['in_visibility'] = 'display:none;'

            if float(call_report_data['inbound_cost']) > 0 or float(call_report_data['outbound_cost']) > 0:

                # Get HTML Template string
                data = temp.TEMPLATE_INVOICE

                for key, value in call_report_data.items():
                    data = data.replace('{' + str(key) + '}', str(value))
                numberInfo = get_did_and_package_info()
                data = data.replace('{did_and_plan}', str(numberInfo[0]))
                total = numberInfo[1]
                vatAmount = float(total)*.2
                newTotal = total+vatAmount
                totalHtml = '<tr> <td \
                style = " text-align:right;" > <b>Amount Paid  \
                </b> </td><td style = "text-align:right;" >  \
                <b>- &pound;' + twoDecimalPoint(inbound_cost + outbound_cost) + ' </b></td></tr> <tr> <td \
                style = " text-align:right;" > <b>Monthly Sub Total \
                </b> </td><td style = "text-align:right;" >  \
                <b> &pound;' + twoDecimalPoint(total) + ' </b></td></tr> \
                <tr> <td style = " text-align:right;" > <b>Vat(20%) \
                                </b> </td><td style = "text-align:right;" > <b> &pound; \
                               ' + twoDecimalPoint(vatAmount) + ' </b></td></tr> \
                <tr> <td style = "background-color:#303030; color:#fedb00; font-size:24px; text-align:right;" > <b>Grand Total \
                                                </b> </td><td style = "background-color:#303030; color:#fedb00; font-size:24px; text-align:right;" > <b> &pound; \
                                               ' + twoDecimalPoint(newTotal) + ' </b></td></tr>'
                data = data.replace('{total_with_vat}', str(totalHtml))
                # return data

                # HTML to PDF conversion
                response = requests.post(
                    "http://sampleapi.quiits.com/api/v1/generate_pdf_from_html",
                    json={
                        "html": data,
                        "file_name": file_name
                    },
                    headers={
                        'Content-Type': 'application/json'
                    }
                )

                # print(response.json()['result'])

                # Email the invoice
                # send_invoice_to_email(call_report_data['email'])

            # return make_response(jsonify(status=1, result=''), 200)
            return jsonify(status=1, message='Success', result={"pdf_link": "https://api.quiits.com/templates/" + file_name})
