from appservices.common.util import *

reports = Blueprint("reports",__name__)

#Fetch ticket categories API
@reports.route("/get_categories",methods=["POST"])
def get_categories():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    categoriesList =[]
    if userId:
        try:
            categories_queyset = TicketCategory.objects(status__in=[1]).all()
            if categories_queyset:
                for each_category in categories_queyset:
                    category_dict={
                    "id":str(each_category.id),
                    "name":each_category.name
                    }
                    categoriesList.append(category_dict)
            data_status["responseStatus"] = 1
            data_status["result"] = "Categories fetched successfully."
            data_status["categoriesList"] = categoriesList
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to fetch categories."  
            return data_status
    else:
        data_status["result"] = "required fields are missing."
        return data_status


#Fetch ticket sub categories API
@reports.route("/get_complaint_types",methods=["POST"])
def get_complaint_types():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    categoryId = request.json.get("categoryId","")
    complaintTypesList =[]
    if userId and categoryId:
        try:
            sub_categories_queyset = TicketSubCategory.objects(categoryId=categoryId,status__in=[1]).order_by('-id').all()
            if sub_categories_queyset:
                for each_sub_category in sub_categories_queyset:
                    print(str(each_sub_category.id))
                    sub_category_dict={
                    "id":str(each_sub_category.id),
                    "name":each_sub_category.name
                    }
                    complaintTypesList.append(sub_category_dict)
            data_status["responseStatus"] = 1
            data_status["result"] = "Complaint types fetched successfully."
            data_status["complaintTypesList"] = complaintTypesList
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to fetch complaint types"  
            return data_status
    else:
        data_status["result"] = "required fields are missing."
        data_status["complaintTypesList"] = complaintTypesList
        return data_status 


#Fetch ticket child categories API
@reports.route("/get_subjects",methods=["POST"])
def get_subjects():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    subCategoryId = request.json.get("subCategoryId","")
    subjectsList =[]
    if userId:
        try:
            child_categories_queyset = TicketChildCategory.objects(subCategoryId=subCategoryId,status__in=[1]).order_by('-id').all()
            if child_categories_queyset:
                for each_child_category in child_categories_queyset:
                    child_category_dict={
                    "id":str(each_child_category.id),
                    "name":each_child_category.name
                    }
                    subjectsList.append(child_category_dict)
            data_status["responseStatus"] = 1
            data_status["result"] = "Subjects fetched successfully."
            data_status["subjectsList"] = subjectsList
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to fetch subjects"  
            return data_status
    else:
        data_status["result"] = "required fields are missing."
        return data_status 


#Add complaint API
@reports.route("/add_complaint",methods=["POST"])
def add_complaint():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    categoryId = request.json.get("categoryId","")
    complaintTypeId = request.json.get("complaintTypeId","")
    subjectId = request.json.get("subjectId","")
    priority = request.json.get("priority","")
    document = request.json.get("document","")
    transactionId = request.json.get("transactionId","")
    message = request.json.get("message","")

    if categoryId and complaintTypeId and message:
        try:
            complaint_table = ComplaintReport(
                userId=userId,
                categoryId=categoryId,
                complaintTypeId=complaintTypeId,
                subjectId=subjectId,
                priority=priority,
                document=document,
                transactionId=transactionId,
                message=message,
                createdOn = datetime.datetime.now()
                # status=0
                )
            save_table = complaint_table.save()
            complaintId = str(save_table.id)

            complaint_reports_queyset = ComplaintReport.objects().all()
            reports_count = complaint_reports_queyset.count()
            complaintNumber = "000"+""+str(reports_count)
            if complaintNumber:
                complaint_table.update(complaintNumber=complaintNumber)
            else:
                complaintNumber = "000"+str(random.randint(1,99))
                complaint_table.update(complaintNumber=complaintNumber)

            if document:
                image = upload_file_image(document, "Documents", str(get_epoch_milli_time()), "")
                if image:
                    save_table.update(document=image)

            data_status["responseStatus"] = 1
            data_status["result"] = "Your complaint has been successfully registered. Our Customer Support team will contact you via your registered email or mobile within 24 hours."
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to add complaint."  
            return data_status
    else:
        data_status["result"] = "required fields are missing."
        return data_status

#View complaint API
@reports.route("/view_complaint_reports",methods=["POST"])
def view_complaint_reports():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    startDate = request.json.get("startDate","")
    endDate = request.json.get("endDate","")
    complaintReportsList =[]
    if userId:
        if startDate and endDate:
            startDate = startDate + " 00:00:00"
            endDate = endDate + " 23:59:59"
            start_date = datetime.datetime.strptime(startDate, "%d-%m-%Y %H:%M:%S")
            end_date = datetime.datetime.strptime(endDate, "%d-%m-%Y %H:%M:%S")
            complaint_reports_queyset = ComplaintReport.objects(
                userId=userId,
                createdOn__gte=start_date,
                createdOn__lte=end_date,
                ).order_by("-id").all()
        else:
            complaint_reports_queyset = ComplaintReport.objects(
                userId=userId,
                ).order_by("-id").all()
        try:
            for each_complaint_report in complaint_reports_queyset:
                complaint_dict = {
                "id":str(each_complaint_report.id),
                # "categoryId":str(each_complaint_report.categoryId.id),
                "categoryName":each_complaint_report.categoryId.name,
                # "complaintTypeId":str(each_complaint_report.complaintTypeId.id),
                "complaintTypeName":each_complaint_report.complaintTypeId.name,
                # "subjectId":str(each_complaint_report.subjectId.id),
                "subjectName":each_complaint_report.subjectId.name,
                "priority":each_complaint_report.priority,
                # "transactionId":each_complaint_report.transactionId,
                "message":each_complaint_report.message,
                # "complaintNumber":each_complaint_report.complaintNumber,
                # "createdOn":each_complaint_report.createdOn.strftime("%d %b,%I:%M %p"),
                }
                if each_complaint_report.complaintNumber:
                    complaint_dict["complaintNumber"] = each_complaint_report.complaintNumber
                else:
                    complaint_dict["complaintNumber"] = ""
                if each_complaint_report.createdOn:
                    ist_time=each_complaint_report.createdOn.replace(tzinfo=pytz.utc).astimezone(ist_timezone)
                    complaint_dict["createdOn"] = ist_time.strftime("%m-%d-%Y %I:%M %p")
                
                if each_complaint_report.status == 0:
                    complaint_dict["status"] = "pending"
                else:
                    complaint_dict["status"] = "pending"
                if each_complaint_report.document:
                    complaint_dict["document"] = domain+each_complaint_report.document
                else:
                    complaint_dict["document"] = ""
                complaintReportsList.append(complaint_dict)

            data_status["responseStatus"] = 1
            data_status["result"] = "Complaint reports fetched successfully."
            data_status["complaintReportsList"] = complaintReportsList
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to fetch complaint details."  
            return data_status
    else:
        data_status["result"] = "required fields are missing."
        return data_status
