from appservices.common.util import *

products = Blueprint("products",__name__)


def fetching_product_details(products_queryset):
    product_dict = {}
    try:
        product_dict={
        "id":str(products_queryset.id),
        "productName":products_queryset.productName,
        "sku":products_queryset.sku,
        "price":products_queryset.price,
        "startingPrice":products_queryset.startingPrice,
        "endingPrice":products_queryset.endingPrice,
        "description":products_queryset.description,
        # "payinPaymentGatewayId":str(products_queryset.payinPaymentGatewayId),
        # "payinapiName":products_queryset.payinPaymentGatewayId.apiName

        }
        try:
            if products_queryset.payinPaymentGatewayId:
                product_dict["payinPaymentGatewayId"]=str(products_queryset.payinPaymentGatewayId.id)
                product_dict["apiName"]=products_queryset.payinPaymentGatewayId.apiName
            else:
                product_dict["payinPaymentGatewayId"]=""
                product_dict["apiName"]=""
        except Exception as e:
            product_dict["payinPaymentGatewayId"]=""
            product_dict["apiName"]=""
        

        try:
            if products_queryset.payinPaymentGatewayId:
                product_dict["priceType"]=products_queryset.payinPaymentGatewayId.priceType
            else:
                product_dict["priceType"]=""
        except Exception as e:
            product_dict["payinPaymentGatewayId"]=""
            product_dict["apiName"]=""
        

        if products_queryset.status==1:
            product_dict["actionText"] = "Active"
        else:
            product_dict["actionText"] = "Deactive"

        if products_queryset.createdOn:
            product_dict["createdOn"] = products_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            product_dict["createdOn"] = ""

    except Exception as e:
        app.logger.error(traceback.format_exc())
    return product_dict


@products.route("/get_products_list",methods=["POST","GET"])
def get_products_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    productsList = []
    payinList = []
    
    adminId = session.get("adminId")
    # permissionsList = check_permissions(session.get("adminId"),"productsPermissions")
    # if "view" in permissionsList:
    try:
        redirectTo = request.args.get("redirectTo","product")
        if redirectTo:
            redirectval = redirectTo
        else:
            redirectval = "product"
        search_element = request.args.get("search_element","")


        products_queryset = Products.objects(status__in=[0,1]).order_by("-id")
        if search_element:
            products_queryset = products_queryset.filter(Q(productName__icontains=search_element))


        # 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 = products_queryset.count()

        start = (page - 1) * per_page

        end = min(start + per_page, total_count)

        total_products = products_queryset[start:end]
        
        snoCount = start
        for each_product in total_products:
            snoCount +=1
            product_dict = fetching_product_details(each_product)
            product_dict["snoCount"]=snoCount
            productsList.append(product_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="product")

        payin_queryset = TransactionAPI.objects(transactionType="PaymentGateway", status=1).order_by('-id')
        for each_payin in payin_queryset:
            payinDict = fetching_transaction_api_details(each_payin)
            payinList.append(payinDict)


        return render_template("super_admin_templates/products_list.html",
            pagination=pagination,
            productsList=productsList,
            payinList=payinList,
            redirectval=redirectval,
            search_element=search_element
            )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to fetch products details!!"
        return render_template("super_admin_templates/products_list.html", 
            error=error,
            pagination=pagination,
            productsList=productsList,
            payinList=payinList,
            search_element=search_element
            )
    # else:
    #     flash("Staff member does not have given view products permissions!!")
    #     return redirect(url_for("admin.dashboard"))
@products.route("/create_product",methods=["POST","GET"])
def create_product():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        # permissionsList = check_permissions(adminId,"productsPermissions")
        # if "add" in permissionsList:
        if request.method == "GET":
            return render_template("super_admin_templates/products_list.html")

        if request.method == "POST":
            productName = request.form.get("productName","")
            sku = request.form.get("sku","")
            price = request.form.get("price",0)
            startingPrice = request.form.get("startingPrice",0)
            endingPrice = request.form.get("endingPrice",0)
            description = request.form.get("description","")
            payinPaymentGatewayId = request.form.get("payinPaymentGatewayId", "")

            print("(price)",price)

            if productName and sku and startingPrice and endingPrice and payinPaymentGatewayId:
                try:
                    product_table = Products(
                        productName = productName,
                        sku = sku,
                        price = float(price),
                        startingPrice = startingPrice,
                        endingPrice = endingPrice,
                        description = description,
                        payinPaymentGatewayId = payinPaymentGatewayId,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = product_table.save()
                    productId = str(save_table.id)

                    flash("Products created successfully!")
                    return redirect(url_for("products.get_products_list",redirectTo="product"))
                except Exception as e:
                    flash("Unable to create product details!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("products.get_products_list",redirectTo="product"))
        else:
            flash("Required fields are missing!!")
            return redirect(url_for("products.get_products_list",redirectTo="product"))
        # else:
        #     flash("Staff member does not have given create product permissions!!")
        #     return redirect(url_for("products.get_products_list",redirectTo="product"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to create product details!!"
        return render_template("super_admin_templates/products_list.html",error=error,redirectTo="product")



# Update product
@products.route("/update_products",methods=["POST","GET"])
def update_products():
    if not session.get("adminId"):
        return redirect("admin_login")
    # permissionsList = check_permissions(session.get("adminId"),"productsPermissions")
    # if "edit" in permissionsList:
    try:
        productId = request.args.get("productId","")
        if not productId:
            flash("Required fields are missing!!")
            return redirect(url_for("products.get_products_list",redirectTo="product"))
        if request.method == "POST":
            productName = request.form.get("productName","")
            sku = request.form.get("sku","")
            price = request.form.get("price",0)
            startingPrice = request.form.get("startingPrice",0)
            endingPrice = request.form.get("endingPrice",0)
            description = request.form.get("description","")
            payinPaymentGatewayId = request.form.get("payinPaymentGatewayId","")
            print(price,"(((((((((((price)))))))))))")
            # if priceType != "common":
            #     price = 0
            product_queryset = Products.objects(id=productId,status__nin=[2]).first()
            if product_queryset:
                product_queryset.update(
                    productName = productName,
                    sku = sku,
                    price = float(price),
                    startingPrice = float(startingPrice),
                    endingPrice = float(endingPrice),
                    description = description,
                    payinPaymentGatewayId = ObjectId(payinPaymentGatewayId),

                    )

                flash(" Products updated successfully!")
                return redirect(url_for("products.get_products_list",redirectTo="product"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("products.get_products_list",redirectTo="product"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update Products!!"
        return redirect(url_for("products.get_products_list",redirectTo="product"))
    # else:
    #     flash("Staff member does not have given update product permissions!!")
    #     return redirect(url_for("products.get_products_list",redirectTo="product"))



# Update Products status
@products.route("/update_product_status",methods=["POST","GET"])
def update_product_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    # permissionsList = check_permissions(session.get("adminId"),"productsPermissions")
    # if "edit" in permissionsList:
    productId = request.args.get("productId","")
    if productId:
        try:
            product_queryset = Products.objects(id=productId,status__nin=[2]).first()
            if product_queryset:
                if product_queryset.status == 0:
                    product_queryset.update(status=1)
                    flash("Product activated successfully!")
                elif product_queryset.status == 1:
                    product_queryset.update(status=0)
                    flash("Product deactivated successfully!")
                return redirect(url_for("products.get_products_list",redirectTo="product"))
            else:
                flash("Invaild Product id!!")
                return redirect(url_for("products.get_products_list",redirectTo="product"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("products.get_products_list",redirectTo="product"))
    else:
        flash("Required fields are missing!!")
        return redirect(url_for("products.get_products_list"))
    # else:
    #     flash("Staff member does not have given update status product permissions!!")
    #     return redirect(url_for("products.get_products_list",redirectTo="product"))

# Delete Products
@products.route("/delete_product",methods=["GET"])
def delete_product():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        if request.method == "GET":
            productId = request.args.get("productId","")
            if not productId:
                flash("Required fields are missing!!")
                return redirect(url_for("products.get_products_list",redirectTo="product"))

            product_queryset = Products.objects(id=productId,status__in=[0,1]).first()
            if not product_queryset:
                flash("Invalid Product Id!!")
                return redirect(url_for("products.get_products_list",redirectTo="product"))
            product_queryset.update(status=2)
            flash("Product deleted successfully!")
            return redirect(url_for("products.get_products_list",redirectTo="product"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete product!!")
        return redirect(url_for("products.get_products_list",redirectTo="product"))

       