from rest_framework.exceptions import APIException

def generate_final_data(status_code, custom_message=False, key=False):
    """
    Function to generate the final data dict that needs to be sent back to client.
    @param status_code: App specific status_code (string constants)
    @param custom_message: Custom string message
    @param key: specific key
    @return: generated final_data variable
    """
    if status_code == 'INVALID':
        final_data = {"status": "error", "status_code": status_code, "message": "Invalid requests"}

    elif status_code == 'UNAUTHORIZED':
        final_data = {"status": "error", "status_code": status_code,
                      "message": "Unauthorized access."}

    elif status_code == 'INVALID_DATA':
        final_data = {"status": "error", "status_code": status_code,
                      "message": "invaid data"}

    elif status_code == 'FAILED':
        final_data = {"status": "error", "status_code": status_code,
                      "message": "Network seems to be busy. Please try again after some time"}

    elif status_code == 'API_KEY_NOT_FOUND':
        final_data = {"status": "error", "status_code": status_code, "message": "API Key is not provided"}

    elif status_code == 'INVALID_API_KEY':
        final_data = {"status": "error", "status_code": status_code, "message": "Invalid API key"}

    elif status_code == 'INVALID_ACCESS_KEY':
        final_data = {"status": "error", "status_code": status_code, "message": "Invalid Access key"}

    elif status_code == 'ACCESS_KEY_NOT_FOUND':
        final_data = {"status": "error", "status_code": status_code, "message": "Access key is not provided"}

    elif status_code == 'INVALID_EMP_ID':
        final_data = {"status": "error", "status_code": status_code, "message": "Invalid Employee id"}

    elif status_code == 'EMP_ID_NOT_FOUND':
        final_data = {"status": "error", "status_code": status_code, "message": "Employee id is not provided"}

    elif status_code == 'INVALID_EMP_ROLE':
        final_data = {"status": "error", "status_code": status_code, "message": "Invalid Employee Role"}

    elif status_code == 'EMP_ROLE_NOT_FOUND':
        final_data = {"status": "error", "status_code": status_code, "message": "Employee Role is not provided"}

    elif status_code == 'INVALID_ACCESS_CODE':
        final_data = {"status": "error", "status_code": status_code, "message": "Invalid Access Code"}

    elif status_code == 'ACCESS_CODE_NOT_FOUND':
        final_data = {"status": "error", "status_code": status_code, "message": "Access Code is not provided"}

    elif status_code == 'INVALID_ACCESS_KEY':
        final_data = {"status": "error", "status_code": status_code, "message": "Invalid Access key"}

    elif status_code == 'CUSTOM_FAILED':
        final_data = {"status": "error", "status_code": status_code, "message": custom_message}

    elif status_code == 'ERROR':
        final_data = {"status": "error", "status_code": status_code, "message": "Please try again after some time"}

    elif status_code == 'VALIDATION_ERROR':
        final_data = {"status": "error", "status_code": status_code, "message": "Validation error"}

    elif status_code == 'DATA_SAVE_FAILED':
        final_data = {"status": "error", "status_code": status_code, "message": "Failed to save the data"}

    elif status_code == 'DATA_UPDATE_FAILED':
        final_data = {"status": "error", "status_code": status_code, "message": "Failed to update the data"}

    elif status_code == 'DATA_DELETE_FAILED':
        final_data = {"status": "error", "status_code": status_code, "message": "Failed to delete the data"}

    elif status_code == 'SUCCESS':
        final_data = {"status": "success", "status_code": status_code, "message": "Success"}

    elif status_code == 'CUSTOM_SUCCESS':
        final_data = {"status": "success", "status_code": status_code,
                      "message": custom_message}

    elif status_code == 'DATA_FOUND':
        final_data = {"status": "success", "status_code": status_code,"Remarks": "Data retrieved successfully"}

    elif status_code == 'DATA_NOT_FOUND':
        final_data = {"status": "error", "status_code": status_code, "message": "No data found"}

    elif status_code == 'DATA_SAVED':
        final_data = {"status": "success", "status_code": status_code, "message": "Data saved successfully"}

    elif status_code == 'DATA_UPDATED':
        final_data = {"status": "success", "status_code": status_code, "message": "Data updated successfully"}

    elif status_code == 'DATA_DELETED':
        final_data = {"status": "success", "status_code": status_code, "message": "Data deleted successfully"}

    elif status_code == 'DATA_BACKUP_COMPLETED':
        final_data = {"status": "success", "status_code": status_code, "message": "successfully backed up database"}


    else:
        final_data = {"status": "error", "status_code": status_code, "message": "Invalid request"}

    if custom_message:
        final_data['message'] = custom_message

    return final_data


def populate_errors(errors):
    """
    Method for populating errors serializer
    @param errors: errors object
    @return: Final list of errors
    """

    final = []
    for key, values in errors.items():
        final.append({'field': key, 'errors': values})

    return final



class CustomExcemption(APIException):
    """Custom exception for permission denied with a dictionary."""
    status_code = 403  #
    default_detail = {'status': 'failed', 'status_code': 'CUSTOM_ERROR', 'message': 'Custom error message'}
    default_code = 'permission_denied'

    def __init__(self, detail=None, code=None):
        if detail is not None:
            self.detail = detail
        else:
            self.detail = self.default_detail
        if code is not None:
            self.status_code = code


