from appservices.common.util import *

transaction_report = Blueprint("transaction_report",__name__)

def fetch_transaction_reports_details(txn_queryset):
    txn_dict = {}
    try:
        txn_dict = {
        "id":str(txn_queryset.id),
        "userId":str(txn_queryset.userId.id),
        "userName":txn_queryset.userId.phoneNumber+"-"+txn_queryset.userId.fullName,
        "txnID":txn_queryset.transactionId,
        "categoryName":txn_queryset.categoryName,
        "serviceName":txn_queryset.serviceName,
        "operatorName":txn_queryset.operatorName,
        "number":txn_queryset.mobileNumber,
        "amount":int(txn_queryset.amount),
        "totalAmount":int(txn_queryset.amount),
        "status":txn_queryset.status,
        "charge":"",
        "margin":"",
        "channel":"",
        "requestedDate":"",
        "updatedDate":"",
        }
        if txn_queryset.status == 1:
            txn_dict["status"] = "Success"
        elif txn_queryset.status == 2:
            txn_dict["status"] = "Processing"
        else:
            txn_dict["status"] = "Failed"

        try:
            if txn_queryset.categoryId:
                txn_dict["categoryId"] = str(txn_queryset.categoryId.id)
                txn_dict["categoryName"] = txn_queryset.categoryId.categoryName
            else:
                txn_dict["categoryId"] = ""
                # txn_dict["categoryName"] = ""
        except:
            txn_dict["categoryId"] = ""

        try:
            if txn_queryset.serviceId:
                txn_dict["serviceId"] = str(txn_queryset.serviceId.id)
                txn_dict["serviceName"] = txn_queryset.serviceId.serviceName
            else:
                txn_dict["serviceId"] = ""
                # txn_dict["serviceName"] = ""
        except:
            txn_dict["serviceId"] = ""

        try:
            if txn_queryset.operatorId:
                txn_dict["operatorId"] = str(txn_queryset.operatorId.id)
                txn_dict["operatorName"] = txn_queryset.operatorId.operatorName
            else:
                txn_dict["operatorId"] = ""
                # txn_dict["operatorName"] = ""
        except:
            txn_dict["operatorId"] = ""

        if txn_queryset.createdOn:
            txn_dict["createdOn"] = txn_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            txn_dict["createdOn"] = ""

    except Exception as e:
        app.logger.error(traceback.format_exc())
    return txn_dict

@transaction_report.route("/get_transactions_reports",methods=["GET","POST"])
def get_transactions_reports():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")

    transactionsReportsList = []

    try:
        redirectTo = request.args.get("redirectTo","")
        if redirectTo:
            redirectval=redirectTo
        else:
            redirectval = "Report"
        # if request.method == "POST":
        start_date_str = request.form.get("start_date","")
        end_date_str = request.form.get("end_date","")

        if start_date_str and end_date_str:
            startDate = start_date_str + " 00:00:00"
            endDate = end_date_str + " 23:59:59"
            start_date = datetime.datetime.strptime(startDate, '%Y-%m-%d %H:%M:%S')
            end_date = datetime.datetime.strptime(endDate, '%Y-%m-%d %H:%M:%S')

            transactions_reports_queryset = Transactions.objects(
                createdOn__gte = start_date,
                createdOn__lte = end_date
                ).order_by('-id').all()
            print("this working")
        else:
            transactions_reports_queryset = Transactions.objects(status__in=[0,1,2]).order_by('-id').all()
            print("else")

        for each_transaction_report in transactions_reports_queryset:
            transaction_data = fetch_transaction_reports_details(each_transaction_report)
            transactionsReportsList.append(transaction_data)

        return render_template("super_admin_templates/transaction_reports_list.html",
            transactionsReportsList = transactionsReportsList,
            redirectval = redirectval,
            # startDate=startDate,
            # endDate=endDate
            )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        # error = "Unable to fetch categories details!!"
        return render_template("super_admin_templates/transaction_reports_list.html",
            transactionsReportsList=transactionsReportsList,
            redirectval=redirectval,
            )
    return render_template("super_admin_templates/transaction_reports_list.html")


@transaction_report.route("/pay_in_transactions_reports",methods=["POST","GET"])
def pay_in_transactions_reports():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        permissionsList = check_permissions(session.get("adminId"),"payinTransactionReportPermissions")
        if "view" in permissionsList:
            payInTransactionsList = []
            merchantsList = []
            apiDropdownList =[]
            platformList = []

            startDate = request.args.get("startDate","")
            endDate = request.args.get("endDate","")
            transactionId = request.args.get("transactionId","")
            merchantName = request.args.get("merchantName","")
            selectStatus = request.args.get("selectStatus","")
            searchId=request.args.get("searchId","")
            merchantId = request.args.get("merchantId","")
            status = []

            # Set default date format
            date_format = "%d-%m-%Y"
            pagination = None
            try:
                if startDate:
                    startDate = datetime.datetime.strptime(startDate, date_format)
                    startDate = startDate.replace(hour=0, minute=0, second=0, microsecond=0)
                else:
                    startDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)

                if endDate:
                    endDate = datetime.datetime.strptime(endDate, date_format)
                    endDate = endDate.replace(hour=23, minute=59, second=59, microsecond=999999)
                else:
                    endDate = datetime.datetime.now().replace(hour=23, minute=59, second=59, microsecond=999999)
            except Exception as ve:
                app.logger.error("Date parsing error: %s", ve)
                startDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
                endDate = datetime.datetime.now().replace(hour=23, minute=59, second=59, microsecond=999999)

            merchants_queryset = Users.objects(status__nin=[2]).order_by("-id")
            for each_merchant in merchants_queryset:
                merchantDict = fetching_user_details(each_merchant)
                merchantsList.append(merchantDict)
            

            if selectStatus == "All" or selectStatus == "":
                status = [0,1,2,3,4,5]
            elif selectStatus == "Success":
                status = [1]
            elif selectStatus == "Processing":
                status = [2]
            elif selectStatus == "Refund":
                status = [4,5]
            else:
                status = [0]

            wallet_transactions_queryset = WalletTransactions.objects(
                createdOn__gte=startDate,createdOn__lte=endDate,status__in=status).order_by("-id").all()
            
            if merchantName:
                merchantIds = []
                merchants_queryset = Users.objects(fullName__icontains=merchantName)
                merchantIds = [str(each_merchant.id) for each_merchant in merchants_queryset]
                wallet_transactions_queryset = wallet_transactions_queryset.filter(userId__in=merchantIds)

            if transactionId:
                wallet_transactions_queryset = wallet_transactions_queryset.filter(transactionId__icontains=transactionId)

            if merchantId:
                wallet_transactions_queryset = wallet_transactions_queryset.filter(userId__in=[merchantId])

            if searchId:
                wallet_transactions_queryset = wallet_transactions_queryset.filter(Q(orderId__icontains=searchId) | Q(transactionId__icontains=searchId))

            # Get the current page from the query parameters
            page = request.args.get(get_page_parameter(), type=int, default=1)

            per_page = 20  # Number of items per page

            # Query the database for the current page's data
            total_count = wallet_transactions_queryset.count()

            start = (page - 1) * per_page

            end = min(start + per_page, total_count)

            total_payins = wallet_transactions_queryset[start:end]
            
            snoCount = start
            for each_pay_in in total_payins:
                snoCount +=1
                payIndDict = fetching_payin_details(each_pay_in)
                payIndDict["snoCount"]=snoCount
                payInTransactionsList.append(payIndDict)

            apiname_queryset = TransactionAPI.objects(status__in=[0,1]).order_by("sorting")  
            for each_payin_transaction in apiname_queryset:
                payin_transaction_dict = fetching_transaction_api_details(each_payin_transaction)
                apiDropdownList.append(payin_transaction_dict)     

            # Pagination object for rendering pagination controls in the template
            pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right", record_name="payouts")

            return render_template("super_admin_templates/pay_in_transactions_reports_list.html",
                pagination=pagination,
                selectStatus=selectStatus,
                merchantName=merchantName,
                transactionId=transactionId,
                startDate=startDate.strftime(date_format),
                endDate=endDate.strftime(date_format),
                payInTransactionsList=payInTransactionsList,
                merchantId=merchantId,
                merchantsList=merchantsList,
                platformList =platformList,
                apiDropdownList=apiDropdownList
                )
        else:
            flash("Staff member does not have given view payin transactions reports permissions!!")
            return render_template("super_admin_templates/pay_in_transactions_reports_list.html")
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to fetched pay in transactions data!!"
        return render_template("super_admin_templates/pay_in_transactions_reports_list.html", 
            error=error,
            pagination=pagination,
            selectStatus=selectStatus,
            transactionId=transactionId,
            merchantName=merchantName,
            startDate=startDate.strftime(date_format),
            endDate=endDate.strftime(date_format),
            payInTransactionsList=payInTransactionsList,
            merchantId=merchantId,
            merchantsList=merchantsList,
            platformList=platformList,
            apiDropdownList=apiDropdownList
            )