from flask import request
import requests
import json
import xmltodict

from log_config.logger import print_log
import config
from clients.set_request_parameters import get_request_params


def send_decentro_pan_validation_request(vendor=None):
    headers = {
        'content-type': 'application/json',
        'client_id': config.DECENTRO_CLIENT_ID,
        'client_secret': config.DECENTRO_CLIENT_SECRET,
        'module_secret': config.DECENTRO_MODULE_SECRET
    }
    payload = {
        'reference_id': request.json.get('application_id'),
        'document_type': request.json.get('document_type'),  # needed
        'id_number': request.json.get('pan_card'),  # needed
        'consent': config.Consent,  # needed
        'consent_purpose': 'Bank validation purpose only'
    }
    url = config.DECENTRO_PAN_URL
    print_log('Requesting Decentro PAN', vendor)
    response = requests.post(url, data=json.dumps(payload), headers=headers)
    response = response.json()
    print_log('Decentro Response Received', vendor)
    return response


def send_equifax_pan_validation_request(vendor=None):
    request_params = get_request_params('PAN')

    sm_template = """<?xml version="1.0" encoding="UTF-8"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://services.equifax.com/eport/ws/schemas/1.0">
        <soapenv:Header/>
        <soapenv:Body>
            <InquiryRequest>
                <RequestHeader>
                    <CustomerId>%s</CustomerId>
                    <UserId>%s</UserId>
                    <Password>%s</Password>
                    <MemberNumber>%s</MemberNumber>
                    <SecurityCode>%s</SecurityCode>
                    <ProductCode>%s</ProductCode>
                    <ProductVersion>%s</ProductVersion>
                    <ReportFormat>%s</ReportFormat>
                </RequestHeader>
                <RequestBody>
                    <InquiryPurpose>%s</InquiryPurpose>
                    <FirstName>%s</FirstName>
                    <LastName>%s</LastName>
                    <PANId>%s</PANId>
                    <DOB>%s</DOB>
                </RequestBody>
            </InquiryRequest>
        </soapenv:Body>
    </soapenv:Envelope>
    """

    soap_message = sm_template % (
        request_params["CustomerId"], request_params["UserId"], request_params["Password"], request_params["MemberNumber"],
        request_params["SecurityCode"], request_params["ProductCode"], request_params["ProductVersion"],
        request_params["ReportFormat"],
        request_params["Purpose"], request_params["FirstName"], request_params["LastName"], request_params["PanCard"],
        request_params["DOB"])
    print_log('Equifax Request Sending', vendor)
    url = config.EQUIFAX_URL
    response = requests.post(url, data=soap_message)
    print_log('Equifax PAN response received', vendor)
    return xmltodict.parse(response.content)


def check_equifax_pan_report(pan_data, vendor=None):
    print_log('Entered Equifax PAN checking', vendor)
    pan_data_report = []
    response_header_pan = pan_data["soapenv:Envelope"]["soapenv:Body"]["sch:InquiryResponse"]
    if "sch:ReportData" in response_header_pan:
        if "sch:VerifyIDResponse" in response_header_pan["sch:ReportData"]:
            if "sch:vidNsdlResponses" in response_header_pan["sch:ReportData"]["sch:VerifyIDResponse"]:
                if "sch:nsdlResponse" in response_header_pan["sch:ReportData"]["sch:VerifyIDResponse"][
                        "sch:vidNsdlResponses"]:
                    pan_data_report = response_header_pan["sch:ReportData"]["sch:VerifyIDResponse"]["sch:vidNsdlResponses"][
                        "sch:nsdlResponse"]
        if response_header_pan.get("sch:ReportData").get("sch:VerifyIDResponse"):
            if response_header_pan.get("sch:ReportData").get("sch:VerifyIDResponse").get("sch:vidNsdlResponses"):
                if response_header_pan.get("sch:ReportData").get("sch:VerifyIDResponse").get("sch:vidNsdlResponses").get("sch:nsdlResponse"):
                    if response_header_pan.get("sch:ReportData").get("sch:VerifyIDResponse").get("sch:vidNsdlResponses").get("sch:nsdlResponse").get("sch:PANStatusCode") == 'E':
                        return True, None
        if "sch:returnCode" in pan_data_report:
            if "E" in pan_data_report["sch:returnCode"]:
                return True, None
            elif "N" in pan_data_report["sch:returnCode"]:
                return False, pan_data_report
        elif "sch:Error" in response_header_pan["sch:ReportData"]:
            if "sch:ErrorCode" in response_header_pan["sch:ReportData"]["sch:Error"] and \
                    response_header_pan["sch:ReportData"]["sch:Error"]["sch:ErrorMsg"] is not None:
                return False, response_header_pan["sch:ReportData"]["sch:Error"]
        else:
            return False, None
