from appservices.common.util import *

profile_masters = Blueprint("profile_masters",__name__)

@profile_masters.route("/add_profile",methods=["POST","GET"])
def add_profile():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        if request.method == "POST":
            name = request.form.get("name","")
            code = request.form.get("code","")
            userTypeId = request.form.get("userTypeId","")
            signUpProfile = request.form.get("signUpProfile",False)

            if name and code and userTypeId:
                try:
                    profile_table = Profiles(
                        adminId=adminId,
                        name = name,
                        code = code,
                        userTypeId = userTypeId,
                        signUpProfile = signUpProfile,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = profile_table.save()

                    flash("Profile saved successfully!")
                    return redirect(url_for("profile_masters.profiles_list"))
                except Exception as e:
                    flash("Unable to save profile!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("profile_masters.profiles_list"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("profile_masters.profiles_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save profile!!"
        return render_template("super_admin_templates/profiles_list.html",error=error)


@profile_masters.route("/profiles_list",methods=["POST","GET"])
def profiles_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    profilelList = []
    userTypesList = []
    
    adminId = session.get("adminId")
    try:
        profile_search_element = request.form.get("profile_search_element","")
        
        profiles_queryset = Profiles.objects(status__in=[0,1]).order_by("-id")
        if profile_search_element:
            profiles_queryset = profiles_queryset.filter(Q(name__icontains=profile_search_element))

        for each_profile in profiles_queryset:
            profileDict = fetching_profile_details(each_profile)
            profilelList.append(profileDict)


        user_types_queryset = UserTypes.objects(status__in=[0,1]).order_by("-id")

        for each_user_type in user_types_queryset:
            userTypeDict = fetching_user_type_details(each_user_type)
            userTypesList.append(userTypeDict)

        return render_template("super_admin_templates/profiles_list.html",
            profilelList=profilelList,
            userTypesList=userTypesList,
            profile_search_element=profile_search_element
            )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to fetch profile details!!"
        return render_template("super_admin_templates/profiles_list.html", 
            error=error,
            profilelList=profilelList,
            userTypesList=userTypesList,
            profile_search_element=profile_search_element
            )


@profile_masters.route("/update_profile_status",methods=["POST","GET"])
def update_profile_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    profileId = request.args.get("profileId","")

    if profileId:
        try:
            profile_queryset = Profiles.objects(id=profileId,status__nin=[2]).first()
            if profile_queryset:
                if profile_queryset.status == 0:
                    profile_queryset.update(status=1)
                    flash("Profile activated successfully!")
                elif profile_queryset.status == 1:
                    profile_queryset.update(status=0)
                    flash("Profile deactivated successfully!")
                return redirect(url_for("profile_masters.profiles_list"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("profile_masters.profiles_list"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("profile_masters.profiles_list"))
    else:
        return redirect(url_for("profile_masters.profiles_list"))


@profile_masters.route("/update_profile",methods=["POST","GET"])
def update_profile():
    if not session.get("adminId"):
        return redirect("admin_login")
    try:
        profileId = request.args.get("profileId","")
        if request.method == "POST":
            name = request.form.get("name","")
            code = request.form.get("code","")
            userTypeId = request.form.get("userTypeId","")
            signUpProfile = request.form.get("signUpProfile")

            profile_queryset = Profiles.objects(id=profileId).first()
            if profile_queryset:
                profile_queryset.update(
                    name=name,
                    code=code,
                    userTypeId=ObjectId(userTypeId)
                    )
                if signUpProfile:
                    profile_queryset.update(signUpProfile=True)
                else:
                    profile_queryset.update(signUpProfile=False)
                flash("Profile updated successfully!")
                return redirect(url_for("profile_masters.profiles_list"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("profile_masters.profiles_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update profile!!"
        return redirect(url_for("profile_masters.profiles_list"))


@profile_masters.route("/delete_profile",methods=["GET"])
def delete_profile():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        if request.method == "GET":
            profileId = request.args.get("profileId","")
            profile_queryset = Profiles.objects(id=profileId,status__in=[0,1]).first()
            profile_queryset.update(status=2)
            flash("Profile deleted successfully!")
            return redirect(url_for("profile_masters.profiles_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete profile!!")
        return redirect(url_for("profile_masters.profiles_list"))


def fetching_csv_profile_details(profile_queryset):
    profileDict = {}
    try:
        if profile_queryset.name:
            profileDict["Name"] = profile_queryset.name
        else:
            profileDict["Name"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return profileDict


@profile_masters.route("/profiles_csv_list",methods=["POST","GET"])
def profiles_csv_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    profilelList = []
    
    adminId = session.get("adminId")
    try:
        profiles_queryset = Profiles.objects(status__in=[0,1]).order_by("-id").all()

        for each_profile in profiles_queryset:
            profileDict = fetching_csv_profile_details(each_profile)
            profilelList.append(profileDict)

        fieldnames = ['Name']
        temp_csv_file_name = "/media/profiles_csv_files/"+str(round(time.time() * 1000))+".csv"

        if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/profiles_csv_files/")):
            os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/profiles_csv_files/"))

        full_file_name = app.config['SITE_ROOT']+temp_csv_file_name
        with open(full_file_name, 'w', encoding='UTF8', newline='') as f:
            writer = csv.DictWriter(f, fieldnames=fieldnames)
            writer.writeheader()
            writer.writerows(profilelList)
        save_csv_file = CSVFileExports(
            name=temp_csv_file_name,
            filters=[],
            createdOn=datetime.datetime.now(),
            status=1
            ).save()
        csvFileId = str(save_csv_file.id)

        return send_file(
            app.config['SITE_ROOT']+temp_csv_file_name,
            mimetype='text/csv',
            download_name='Profiles list.csv',
            as_attachment=True
        )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to export CSV data!!")
        return redirect("profile_masters.profiles_list")