from appservices.common.util import *   
def generate_authorization_header(client_key, client_secret):
    """
    Generate the Base64 encoded authorization header.
    """
    combined = f"{client_key}:{client_secret}"
    combined_bytes = combined.encode("utf-8")
    base64_encoded = base64.b64encode(combined_bytes).decode("utf-8")
    return f"Basic {base64_encoded}"

def prepare_headers(client_key, client_secret):
    """
    Prepare the standard headers for the API request.
    """
    authorization_header = generate_authorization_header(client_key, client_secret)
    return {
        "Content-Type": "application/json",
        "Authorization": authorization_header
    }

# PAN KYC Function
def vayana_individual_pan_kyc(get_base_url,client_key, client_secret, pan_number):
    """
    PAN verification API.
    """
    url = get_base_url+"/PanVerification"
    print("Details:", client_key, client_secret)

    # Prepare headers
    vayana_header = prepare_headers(client_key, client_secret)

    vayanaIndividualPanDict = {"responseStatus": 0, "result": ""}

    try:
        vayana_request_body = {"PANNo": pan_number}
        print(vayana_request_body, "((((((((vayana REQUEST BODY )))))))")

        response = requests.post(url, json=vayana_request_body, headers=vayana_header)
        response_status = response.status_code
        vayana_response_json = response.json()
        print(vayana_response_json, response_status, "((((((((vayana RESPONSE BODY))))))))")

        responseStatus = 0
        name = ""
        address = ""
        panStatus = "NA"
        if response_status == 200:
            responseStatus = 1
            PANResponse = vayana_response_json.get("PANResponse", {})
            resultresp = PANResponse.get("result", {})
            name=resultresp.get('name')
            panStatus="VALID"
            result="Success"
            address=resultresp.get('address').get('combinedAddress')
        elif response_status == 401:
            result = "Unauthorized access. Please check credentials."
        elif response_status == 400:
            result = vayana_response_json.get("error", {}).get("message", "Bad Request")
        else:
            result = "An Error occurred. Please try again later."

        vayanaIndividualPanDict = {
            "responseStatus": responseStatus,
            "name":name,
            "address":address,
            "panStatus":panStatus,
            "isIndividual":"",
            "result": result,
            "apiResponse": vayana_response_json
        }

        return vayanaIndividualPanDict
    except Exception as e:
        print("Error during request preparation:", traceback.format_exc())
        vayanaIndividualPanDict["result"] = "An Error occurred. Please try again later."
    
    return vayanaIndividualPanDict

# Aadhaar Send OTP Function
def vayana_aadhar_send_otp(get_base_url,client_key, client_secret,aadhaar_number, aadhaar_name ):
    """
    Aadhaar OTP send API.
    """
    url= get_base_url+"/AadhaarOTP"
    print("Details:", client_key, client_secret)

    # Prepare headers
    vayana_header = prepare_headers(client_key, client_secret)

    print("hearders:",vayana_header)

    vayanaIndividualAadharDict = {"responseStatus": 0, "result": ""}

    try:
        vayana_request_body = {"AadhaarNumber": aadhaar_number, "Name": aadhaar_name}
        print(vayana_request_body, "((((((((vayana REQUEST BODY )))))))")

        response = requests.post(url, json=vayana_request_body, headers=vayana_header)
        response_status = response.status_code
        vayana_response_json = response.json()
        print(vayana_response_json, response_status, "((((((((vayana aadhar RESPONSE BODY))))))))")

        responseStatus = 0
        verifiedStatus = 0
        mobileNumber = ""
        AccessKey=""
        if response_status == 200:
            result="success"
            responseStatus = 1
            responseData = vayana_response_json
            if responseData.get('Status')=="APPROVED":
                verifiedStatus=1
                AccessKey=responseData.get('AccessKey')

        elif response_status == 401:
            result = "Unauthorized access. Please check credentials."
        elif response_status == 400:
            result = vayana_response_json.get("error", {}).get("message", "Bad Request")
        else:
            result = "An Error occurred. Please try again later."

        vayanaIndividualAadharDict = {
        "responseStatus":responseStatus,
        "result": result,
        "responseData": vayana_response_json,
        "verifiedStatus": verifiedStatus,
        "mobileNumber": mobileNumber,
        "accessKey": AccessKey
        }
        return vayanaIndividualAadharDict
    except Exception as e:
        print("Error during request preparation:", traceback.format_exc())
        vayanaIndividualAadharDict["result"] = "An Error occurred. Please try again later."
    
    return vayanaIndividualAadharDict
# Aadhaar Verification Function
def vayana_aadhar_verify_otp(get_base_url,client_key, client_secret, aadhaar_name, aadhaar_number, OTP,access_key):
    """ 
    Aadhaar verification API.
    """
    url = get_base_url+"/AadhaarVerification"
    print("Details:", client_key, client_secret)

    # Prepare headers
    vayana_header = prepare_headers(client_key, client_secret)

    vayanaIndividualAadharVerifyDict = {"responseStatus": 0, "result": ""}

    
    try:
        # Prepare the request body
        vayana_request_body = {
            "AadhaarNumber": aadhaar_number,
            "Name": aadhaar_name,
            "AccessKey": access_key,
            "OTP": OTP
        }
        print(vayana_request_body, "((((((((vayana REQUEST BODY )))))))")

        # Make the POST request
        response = requests.post(url, json=vayana_request_body, headers=vayana_header)
        response_status = response.status_code
        vayana_response_json = response.json()
        print(vayana_response_json, response_status, "((((((((vayana aadhar otp RESPONSE BODY))))))))")

        # Handle the response
        responseStatus = 0
        result = None

        if response_status == 200:
            responseStatus = 1
            result = vayana_response_json
        elif response_status == 401:
            result = "Unauthorized access. Please check credentials."
        elif response_status == 400:
            result = vayana_response_json.get("error", {}).get("message", "Bad Request")
        else:
            result = "An Error occurred. Please try again later."

        # Create the final response dictionary
        vayanaIndividualAadharVerifyDict = {
            "responseStatus": responseStatus,
            "responseData": vayana_response_json,
            "result": result
        }

        return vayanaIndividualAadharVerifyDict

    except Exception as e:
        print("Error during request preparation:", traceback.format_exc())
        return {
            "responseStatus": 0,
            "result": "An Error occurred. Please try again later."
        }


def vayana_company_verify_data(get_base_url,client_key,client_secret,cinNumber):
    """
    Company verification API.
    """
    url = get_base_url+"/mca-detailed"
    print("Details:", client_key,client_secret,url)

    # Prepare headers
    vayana_header = prepare_headers(client_key, client_secret)

    vayanaCompanyVerifyDict = {"responseStatus": 0, "result": ""}

    try:
        vayana_request_body = {"CIN": cinNumber}
        print(vayana_request_body, "((((((((vayana REQUEST BODY )))))))")

        response = requests.post(url, json=vayana_request_body, headers=vayana_header)
        response_status = response.status_code
        vayana_response_json = response.json()
        print(vayana_response_json, response_status, "((((((((vayana RESPONSE BODY))))))))")

        responseStatus=0
        result=""
        companyName=""
        companyActualStatus=""
        companyStatus=""
        apiresponse={}
        CINResponse={}
        directorsDict={}
        directorsList=[]
        if response_status == 200:
            responseStatus = 1
            result = "Success"
            CINResponse = vayana_response_json.get("CINResponse",{})
            apiresponse = CINResponse.get("results",{})
            for each_director in apiresponse.get('director_info').get('current_director'):
                directorsDict={
                "directorName":each_director.get('name'),
                "directorPanNumber":"",
                "address":"",
                "designation":each_director.get('designation'),
                "din":each_director.get('din_pan')
                }
                directorsList.append(directorsDict)
            
            companyActualStatus=apiresponse.get('company_status')
            if companyActualStatus.lower()=="active":
                companyStatus="Active"
            else:
                companyStatus="Inactive"
            companyName=apiresponse.get('mca_name')
        elif response_status == 401:
            result = "Unauthorized access. Please check credentials."
        elif response_status == 400:
            result = vayana_response_json.get("error", {}).get("message", "Bad Request")
        else:
            result = "An Error occurred. Please try again later."
        
        vayanaCompanyVerifyDict = {
            "responseStatus":responseStatus,
            "responseData":[vayana_response_json],
            "directorsList":directorsList,
            "companyActualStatus": companyActualStatus,
            "companyStatus": companyStatus,
            "companyName": companyName,
            "result": result
        }

        return vayanaCompanyVerifyDict
    except Exception as e:
        print("Error during request preparation:", traceback.format_exc())
        vayanaCompanyVerifyDict["result"] = "An Error occurred. Please try again later."
    return vayanaCompanyVerifyDict

def vayana_verify_bank_details(get_base_url,client_key,client_secret,bankAccNo,bankCode):
    """
    Bank verification API.
    """
    url=get_base_url+"/BankAccountVerification"
    print("Details:", client_key, client_secret)

    # Prepare headers
    vayana_header = prepare_headers(client_key, client_secret)

    vayanaBankVerifyDict = {"responseStatus": 0, "result": ""}
    beneficiaryName=""
    try:
        vayana_request_body = {"bankAccNo": bankAccNo, "bankCode": bankCode}
        print(vayana_request_body, "((((((((vayana REQUEST BODY )))))))")


        response = requests.post(url, json=vayana_request_body, headers=vayana_header)
        print(response,"vayana RESPONSE BODY1")
        response_status = response.status_code
        vayana_response_json = response.json()
        print(vayana_response_json, response_status, "((((((((vayana RESPONSE BODY))))))))")
        beneficiaryName=""
        nameMatch=""
        responseStatus = 0
        if response_status == 200:
            if vayana_response_json.get('IsValid')==True:
                responseStatus = 1
                result = "Success"
                beneficiaryName=vayana_response_json.get('AccountHolderName')
            else:
                result=vayana_response_json.get('Message')
        elif response_status == 401:
            result = "Unauthorized access. Please check credentials."
        elif response_status == 400:
            result = vayana_response_json.get("error", {}).get("message", "Bad Request")
        else:
            result = "An Error occurred. Please try again later."
        
        vayanaBankVerifyDict = {
            "responseStatus":responseStatus,
            "nameMatch":nameMatch,
            "beneficiaryName":beneficiaryName,
            "responseData":[vayana_response_json],
            "result": result
        }

        return vayanaBankVerifyDict
    except Exception as e:
        print("Error during request preparation:", traceback.format_exc())
        vayanaBankVerifyDict["result"] = "An Error occurred. Please try again later."
    return vayanaBankVerifyDict