from appservices.common.util import *
from datetime import datetime

downline_list = Blueprint("downline_list", __name__)
@downline_list.route("/downline_list_view", methods=["POST", "GET"])
def downline_list_view():
    try:
        # Check for admin login session
        if not session.get("adminId"):
            return redirect("admin_login")

        redirectTo = request.args.get("redirectTo", "")
        redirectval = redirectTo if redirectTo else "UnsettlementCommission"

        date_format = "%d-%m-%Y"

        # Fetch parameters
        merchantType = request.args.get("merchantType", "")
        startDate = request.args.get("startDate", "")
        endDate = request.args.get("endDate", "")

        # Handle date conversion
        if startDate and endDate:
            startDate = datetime.strptime(startDate, date_format)
            endDate = datetime.strptime(endDate, date_format)
        else:
            startDate = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
            endDate = datetime.now().replace(hour=23, minute=59, second=59, microsecond=999999)

    
        merchants_queryset = Users.objects(merchantType=merchantType, status__nin=[2])
        merchant_list = []
        payin_transaction_summary = []
        payout_transaction_summary = []
        utility_transaction_summary = []

        for user in merchants_queryset:
            parent_name = "N/A"  
            if user.parentId:
                try:
                    
                    parent_user = Users.objects(id=ObjectId(user.parentId)).first()
                    if parent_user:
                        parent_name = parent_user.fullName
                except Exception as e:
                    app.logger.error(f"Error fetching parent user for user {user.fullName}: {str(e)}")
                    app.logger.info(f"Invalid parentId: {user.parentId} for user {user.fullName}")

           
            merchantDict = {
                "userId": str(user.id),
                "userName": user.fullName,
                "merchantType": user.merchantType,
                "parentName": parent_name
            }
            merchant_list.append(merchantDict)

            
            payout_transactions_queryset = FundTransfers.objects(
                userId=user.id,
                createdOn__gte=startDate,
                createdOn__lte=endDate
            )
            payin_transactions_queryset = WalletTransactions.objects(
                userId=user.id,
                createdOn__gte=startDate,
                createdOn__lte=endDate
            )
            utility_transactions_queryset = Transactions.objects(
                userId=user.id,
                createdOn__gte=startDate,
                createdOn__lte=endDate
            )

            payin_total_amount = round(sum(txn.amount for txn in payin_transactions_queryset), 2)
            payin_transaction_count = payin_transactions_queryset.count()

            payout_total_amount = round(sum(txn.amount for txn in payout_transactions_queryset), 2)
            payout_transaction_count = payin_transactions_queryset.count()

            utility_total_amount = round(sum(txn.amount for txn in utility_transactions_queryset), 2)
            utility_transaction_count = utility_transactions_queryset.count()

            payin_transaction_summary.append({
                "userId": str(user.id),
                "userName": user.fullName,
                "parentName": parent_name,
                "merchantType": user.merchantType,
                "totalAmount": payin_total_amount,
                "transactionCount": payin_transaction_count
            })
            payout_transaction_summary.append({
                "userId": str(user.id),
                "userName": user.fullName,
                "parentName": parent_name,
                "merchantType": user.merchantType,
                "totalAmount": payout_total_amount,
                "transactionCount": payout_transaction_count
            })
            utility_transaction_summary.append({
                "userId": str(user.id),
                "userName": user.fullName,
                "parentName": parent_name,
                "merchantType": user.merchantType,
                "totalAmount": utility_total_amount,
                "transactionCount": utility_transaction_count
            })


            print("((((((((((((((((((((_____payin_transaction_summary_____))))))))))))))))))))",payin_transaction_summary)
            print("((((((((((((((((((((payout_transaction_summary))))))))))))))))))))",payout_transaction_summary)
            print("((((((((((((((((((((utility_transaction_summary))))))))))))))))))))",utility_transaction_summary)

        return render_template("super_admin_templates/downline_file_list.html",
                               transaction_summary=payin_transaction_summary,
                               payout_transation=payout_transaction_summary,
                               utility_transation=utility_transaction_summary,

                               redirectval=redirectval,
                               startDate=startDate.strftime(date_format),
                               endDate=endDate.strftime(date_format),
                               merchantType=merchantType)

    except Exception as e:
        app.logger.error(traceback.format_exc())
        app.logger.info(f"Transaction summary: {payin_transaction_summary}")
        app.logger.info(f"Merchant list: {merchant_list}")
        
        error = "Unable to fetch balance transaction data!"
        return render_template("super_admin_templates/downline_file_list.html",
                               error=error,
                               startDate=startDate.strftime(date_format) if startDate else "",
                               endDate=endDate.strftime(date_format) if endDate else "",
                               redirectval=redirectval)