from rest_framework.authentication import get_authorization_header

SUCCESS = 1

# Invalid inputs
INVALID_INPUT = 100
INVALID_PAN = 201

# User
UNABLE_TO_UPDATE_AADHAR_CARD = 300
UNABLE_TO_UPDATE_PAN_DETAILS = 301
UNABLE_TO_UPDATE_REFERENCE_DETAILS = 302
UNABLE_TO_UPDATE_ADDRESS_DETAILS = 304
PINCODE_NOT_FOUND = 305
UNABLE_TO_UPDATE_BANK_DETAILS = 306
UNABLE_TO_CREATE_CUSTOMER = 308
UNABLE_TO_RUN_AUTO_DECISION = 309
UNABLE_TO_FETCH_BUREAU_RESPONSE = 310
AUTHORIZATION_FAILED = 311
USER_ALREADY_EXISTS = 313
UNABLE_TO_UPDATE_DOB = 314

# Loan Application
LOAN_APPLICATION_NOT_FOUND = 400
UNABLE_TO_DECRYPT = 401
INVALID_APPLICATION_DATA = 402
UNABLE_TO_UPDATE_EMPLOYMENT_DETAILS = 403
LOAN_OFFERS_NOT_FOUND = 404
EMI_CALCULATIONS_NOT_FOUND = 405
MANDATE_SETUP_MISSING_BANK = 407
UNABLE_TO_FETCH_VENDOR_ID = 408
UNABLE_TO_FETCH_VENDOR_KEY = 409
UNABLE_TO_FETCH_LENDER_BANK = 410
PRO_FORMA_INVOICE_NOT_FOUND = 411
AGREEMENT_ALREADY_SIGNED = 412
OUTSIDE_LOAN_LIMIT = 413
UNABLE_TO_UPLOAD_EMPLOYMENT_DOCUMENT = 414

# 3P API Call
API_FAILURE = 500
UNABLE_TO_FETCH_IFSC_DETAILS = 501
MANDATE_SETUP_REQUEST_FAILED = 502
UNABLE_TO_VERIFY_EMPLOYMENT_DETAILS = 503
UNABLE_TO_GET_OCR_DETAILS = 504
UNABLE_TO_GENERATE_AADHAR_OTP = 505
UNABLE_TO_VERIFY_AADHAR_OTP = 506
UNABLE_TO_VERIFY_BANK_AC_DETAILS = 507
UNABLE_TO_GENERATE_PAYMENT_LINK = 508

# Document
UNABLE_TO_UPLOAD_DOCUMENT = 600

error_messages = {
    INVALID_INPUT: 'Invalid input',
    UNABLE_TO_UPDATE_AADHAR_CARD: 'Unable to update aadhar card',
    UNABLE_TO_UPDATE_DOB: 'Unable to update dob',
    LOAN_APPLICATION_NOT_FOUND: 'Loan application not found',
    PRO_FORMA_INVOICE_NOT_FOUND: 'Pro forma invoice not found',
    UNABLE_TO_UPDATE_PAN_DETAILS: 'Unable to update pan details',
    UNABLE_TO_UPDATE_REFERENCE_DETAILS: 'Unable to update references details',
    UNABLE_TO_UPDATE_ADDRESS_DETAILS: 'Unable to update address details',
    UNABLE_TO_UPDATE_BANK_DETAILS: 'Unable to update bank details',
    PINCODE_NOT_FOUND: 'Pincode not found',
    API_FAILURE: 'API failed',
    UNABLE_TO_UPLOAD_DOCUMENT: 'Unable to upload document',
    UNABLE_TO_DECRYPT: "Unable to decrypt data",
    INVALID_APPLICATION_DATA: "Invalid link data",
    UNABLE_TO_FETCH_IFSC_DETAILS: "Unable to fetch IFSC code details",
    UNABLE_TO_RUN_AUTO_DECISION: "Unable to run auto decision successfully",
    UNABLE_TO_FETCH_BUREAU_RESPONSE: "Unable to fetch bureau response",
    UNABLE_TO_CREATE_CUSTOMER: "Unable to create customer",
    UNABLE_TO_UPDATE_EMPLOYMENT_DETAILS: "Unable to update employment details",
    LOAN_OFFERS_NOT_FOUND: "Loan offers not found",
    EMI_CALCULATIONS_NOT_FOUND: "EMI calculations not found",
    AUTHORIZATION_FAILED: "User Authorization failed",
    USER_ALREADY_EXISTS: "User already exists",
    MANDATE_SETUP_REQUEST_FAILED: "Mandate setup request failed",
    MANDATE_SETUP_MISSING_BANK: "Missing bank for mandate setup",
    UNABLE_TO_FETCH_VENDOR_ID: "Missing vendor id",
    UNABLE_TO_FETCH_VENDOR_KEY: "Missing vendor key",
    UNABLE_TO_FETCH_LENDER_BANK: "Missing lender bank details",
    UNABLE_TO_VERIFY_EMPLOYMENT_DETAILS: "Unable to verify Employment details",
    UNABLE_TO_GET_OCR_DETAILS: "Unable to get ocr details",
    UNABLE_TO_GENERATE_AADHAR_OTP: "Unable to generate aadhar otp",
    UNABLE_TO_VERIFY_AADHAR_OTP: "Unable to verify aadhar otp",
    UNABLE_TO_VERIFY_BANK_AC_DETAILS: "Unable to verify Bank Account details",
    UNABLE_TO_GENERATE_PAYMENT_LINK: "Unable to generate payment link",
    AGREEMENT_ALREADY_SIGNED: "Agreement already signed",
    OUTSIDE_LOAN_LIMIT: "Loan amount outside loan limit",
    UNABLE_TO_UPLOAD_EMPLOYMENT_DOCUMENT: "Unable to upload employment document",
    INVALID_PAN: "Invalid PAN"
}


def get_bearer_token(request):
    auth = get_authorization_header(request).split()
    if auth and len(auth) == 2 and auth[0].lower() == b'bearer':
        return auth[1].decode('utf-8')

    return None


def get_client_key_secret(request):
    if 'HTTP_X_CLIENT_ID' in request.environ:
        client_id = request.environ['HTTP_X_CLIENT_ID']
        client_secret = request.environ['HTTP_X_CLIENT_SECRET']
        return client_id, client_secret
    return None, None


def get_client_ip(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = request.META.get('REMOTE_ADDR')

    return ip
