from appservices.common.util import *

fee_distribution_setting = Blueprint("fee_distribution_setting",__name__)

# Add Fee Distribution Setting
@fee_distribution_setting.route("/add_fee_distribution_setting",methods=["POST","GET"])
def add_fee_distribution_setting():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            categoryId = request.form.get("categoryId","")
            uplineCommDist = request.form.get("uplineCommDist")

            if categoryId:
                try:
                    fee_distribution_table = FeeDistributionSettings(
                        adminId=adminId,
                        categoryId = categoryId,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = fee_distribution_table.save()
                    feeDistributionSettingId = str(save_table.id)

                    if uplineCommDist == None:
                        save_table.update(uplineCommDist=False)
                    else:
                        save_table.update(uplineCommDist=True)

                    flash("Fee distribution setting saved successfully!")
                    return redirect(url_for("fee_distribution_setting.fee_distribution_settings_list"))
                except Exception as e:
                    flash("Unable to save fee distribution setting!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("fee_distribution_setting.fee_distribution_settings_list"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("fee_distribution_setting.fee_distribution_settings_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save fee distribution setting!!"
        return render_template("super_admin_templates/fee_distribution_settings.html",error=error)

def fetching_fee_distribution_settings_details(each_fee_distribution_setting_queryset):
    fee_distribution_setting_dict = {}
    try:
        fee_distribution_setting_dict={
        "id":str(each_fee_distribution_setting_queryset.id),
        "categoryId":str(each_fee_distribution_setting_queryset.categoryId.id),
        "categoryName":each_fee_distribution_setting_queryset.categoryId.categoryName,
        "uplineCommDist":each_fee_distribution_setting_queryset.uplineCommDist
        }
        if each_fee_distribution_setting_queryset.status==1:
            fee_distribution_setting_dict["actionText"] = "Active"
        else:
            fee_distribution_setting_dict["actionText"] = "Deactive"
        if each_fee_distribution_setting_queryset.createdOn:
            fee_distribution_setting_dict["createdOn"] = each_fee_distribution_setting_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            fee_distribution_setting_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return fee_distribution_setting_dict

# View All fee distribution settings
@fee_distribution_setting.route("/fee_distribution_settings_list",methods=["POST","GET"])
def fee_distribution_settings_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    feeDistributionSettingsList = []
    categoriesList = []
    
    adminId = session.get("adminId")
    try:
        search = False  
        search_element = request.args.get('search_element','')
        if not search_element:
            search_element = request.form.get("search_element","")
        if search_element:
            search = True

        page = request.args.get(get_page_parameter(), type=int, default=1)
        page_start,page_end=fetch_limit_length_based_on_page_index(page,20)
        pagination = Pagination(
            page=page,
            record_name='fee_distribution_setting',
            per_page=20,
            alignment="right"
            )
        fee_distribution_settings_queryset = FeeDistributionSettings.objects(status__in=[0,1]).order_by("-id")
        categories_queryset = Categories.objects(status__in=[0,1]).order_by('-id').all()
        for each_category in categories_queryset:
            category_dict = {
            "categoryName": each_category.categoryName,
            "id": str(each_category.id),
            }
            categoriesList.append(category_dict)
            print(category_dict["id"])
            print("category_dict[]")
            print("category_dict[]")
        # if search_element:
        #     fee_distribution_settings_queryset = fee_distribution_settings_queryset.filter(Q(regionName__icontains=search_element))
        length = fee_distribution_settings_queryset.count()
        # fee_distribution_settings_queryset=fee_distribution_settings_queryset[page_start:page_end]
        # regions_queryset=regions_queryset.limit(page_start,page_end)

        for each_fee_distribution_setting in fee_distribution_settings_queryset:
            fee_distribution_setting_dict = fetching_fee_distribution_settings_details(each_fee_distribution_setting)
            print(fee_distribution_setting_dict["categoryId"])
            print("categoryId")
            print("categoryId")
            feeDistributionSettingsList.append(fee_distribution_setting_dict)

        pagination = Pagination(
            page=page,
            total=length,
            found=length,
            record_name='fee_distribution_setting',
            per_page=20,
            alignment="right"
            )
        return render_template("super_admin_templates/fee_distribution_settings_list.html",
            feeDistributionSettingsList=feeDistributionSettingsList,
            categoriesList = categoriesList,
            search_element=search_element,
            pagination=pagination,
            )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to fetch fee_distribution_settings_details!!"
        return render_template("super_admin_templates/fee_distribution_settings_list.html",
            feeDistributionSettingsList=feeDistributionSettingsList,
            search_element=search_element,
            pagination=pagination,
            )


# Update fee distribution setting type status
@fee_distribution_setting.route("/update_fee_distribution_setting_status",methods=["POST","GET"])
def update_fee_distribution_setting_status():
  if not session.get("adminId"):
      return redirect("admin_login")
  feeDistributionSettingId = request.args.get("feeDistributionSettingId","")

  if feeDistributionSettingId:
      try:
          fee_distribution_setting_queryset = FeeDistributionSettings.objects(id=feeDistributionSettingId,status__nin=[2]).first()
          if fee_distribution_setting_queryset:
              if fee_distribution_setting_queryset.status == 0:
                  fee_distribution_setting_queryset.update(status=1)
                  flash("Fee distribution setting activated successfully!")
              elif fee_distribution_setting_queryset.status == 1:
                  fee_distribution_setting_queryset.update(status=0)
                  flash("Fee distribution setting deactivated successfully!")
              return redirect(url_for("fee_distribution_setting.fee_distribution_settings_list"))
          else:
              flash("Invaild id!!")
              return redirect(url_for("fee_distribution_setting.fee_distribution_settings_list"))
      except Exception as e:
          app.logger.error(traceback.format_exc())
          return redirect(url_for("fee_distribution_setting.fee_distribution_settings_list"))
  else:
      return redirect(url_for("fee_distribution_setting.fee_distribution_settings_list"))



# Delete fee distribution setting
@fee_distribution_setting.route("/delete_fee_distribution_setting",methods=["GET"])
def delete_fee_distribution_setting():
  try:
      if not session.get("adminId"):
          return redirect("admin_login")
      if request.method == "GET":
          feeDistributionSettingId = request.args.get("feeDistributionSettingId","")
          fee_distribution_setting_queryset = FeeDistributionSettings.objects(id=feeDistributionSettingId,status__in=[0,1]).first()
          fee_distribution_setting_queryset.update(status=2)
          flash("Fee distribution setting deleted successfully!")
          return redirect(url_for("fee_distribution_setting.fee_distribution_settings_list"))
  except Exception as e:
      app.logger.error(traceback.format_exc())
      flash("Unable to delete fee distribution setting!!")
      return redirect(url_for("fee_distribution_setting.fee_distribution_settings_list"))



# Update fee distribution setting
@fee_distribution_setting.route("/update_fee_distribution_setting",methods=["POST","GET"])
def update_fee_distribution_setting():
  if not session.get("adminId"):
      return redirect("admin_login")
  try:
      feeDistributionSettingId = request.args.get("feeDistributionSettingId","")
      if request.method == "POST":
          categoryId = request.form.get("categoryId","")
          uplineCommDist = request.form.get("uplineCommDist")
          fee_distribution_setting_queryset = FeeDistributionSettings.objects(id=feeDistributionSettingId).first()
          if fee_distribution_setting_queryset:
              fee_distribution_setting_queryset.update(
                  categoryId = ObjectId(categoryId),
                  )
              if uplineCommDist == None:
                  fee_distribution_setting_queryset.update(uplineCommDist=False)
              else:
                  fee_distribution_setting_queryset.update(uplineCommDist=True)
              flash("Fee distribution setting updated successfully!")
              return redirect(url_for("fee_distribution_setting.fee_distribution_settings_list"))
          else:
              flash("Invaild id!!")
              return redirect(url_for("fee_distribution_setting.fee_distribution_settings_list"))
  except Exception as e:
      app.logger.error(traceback.format_exc())
      error = "Unable to update fee distribution setting!!"
      return redirect(url_for("fee_distribution_setting.fee_distribution_settings_list"))