from appservices.common.util import *
from appservices.common.form_schemas import *

from datetime import datetime

downline_list = Blueprint("downline_list", __name__)
          
@downline_list.route("/downline_list_view", methods=["POST", "GET"])
@adminid_access_token_required
def downline_list_view():
    if not session.get("adminId"):
        return redirect("admin_login")
    masterIfscBanksList = []
    
    adminId = session.get("adminId")
    
    permissionsList = check_permissions(session.get("adminId"),"downlineListPermissions")
    form = DownlineListSearchForm(request.args)
    redirectval=""
    snoCount=0
    pagination=None
    if "view" in permissionsList:
        try:
            # Check for admin login session
            if not session.get("adminId"):
                return redirect("admin_login")
            merchant_list = []
            payin_transaction_summary = []
            payout_transaction_summary = []
            utility_transaction_summary = []
            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 form.validate():

                page = request.args.get(get_page_parameter(), type=int, default=1)
                per_page = 20
                start = (page - 1) * per_page
                snoCount = int(start)
                total_count=0
        
                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]).only("id","fullName","merchantType").limit(per_page).skip(start)
                total_count = Users.objects(merchantType=merchantType, status__nin=[2]).count()

                for user in merchants_queryset:
                    parent_name = "N/A"  
                    try:
                        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}")
                    except Exception as e:
                        app.logger.error(f"No parent Id for user {user.fullName}: {str(e)}")

                
                    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
                    # )

                    filters = Q(
                        userId=user.id,
                        createdOn__gte=startDate,
                        createdOn__lte=endDate)
                    
                    payin_total_amount = WalletTransactions.objects(filters).sum('amount')
                    payout_total_amount = FundTransfers.objects(filters).sum('amount')
                    utility_total_amount = Transactions.objects(filters).sum('amount')

                    payin_transaction_count = WalletTransactions.objects(filters).count()
                    payout_transaction_count = FundTransfers.objects(filters).count()
                    utility_transaction_count = Transactions.objects(filters).count()

                    # 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": round(payin_total_amount,2),
                        "transactionCount": payin_transaction_count
                    })
                    payout_transaction_summary.append({
                        "userId": str(user.id),
                        "userName": user.fullName,
                        "parentName": parent_name,
                        "merchantType": user.merchantType,
                        "totalAmount": round(payout_total_amount,2),
                        "transactionCount": payout_transaction_count
                    })
                    utility_transaction_summary.append({
                        "userId": str(user.id),
                        "userName": user.fullName,
                        "parentName": parent_name,
                        "merchantType": user.merchantType,
                        "totalAmount": round(utility_total_amount,2),
                        "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)
                    pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right", record_name="downlinelist")
            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)
                print("form errors",form.errors)

            return render_template("super_admin_templates/downline_file_list.html",
                                   pagination=pagination,
                                   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,
                                   form=form,
                                   snoCount=snoCount
                                   )

        except Exception as e:
            app.logger.error(traceback.format_exc())
            
            error = "Unable to fetch balance transaction data!"
            return render_template("super_admin_templates/downline_file_list.html",
                                   pagination=pagination,
                                   error=error,
                                   redirectval=redirectval,
                                   form=form,
                                   snoCount=snoCount
                                   )
    else:
        flash("The staff member does not have permission to view Downline list.", "danger")
        return redirect(url_for("admin.dashboard"))