<!--- Save result.extracted_data (pPatient, pPtContacts, pPayer, Medications, pProblem, pAdmit, pAssessment) via bulk_import_ai when Get Status completes. --->
<cfparam name="vertexExtractedData" default="#{}#" />
<cfparam name="vertexPollResultMeta" default="#{}#" />
<cfparam name="vertexSavePatientIdVal" default="0" />
<cfparam name="vertexSaveAssessmentId" default="0" />
<cfparam name="vertexSaveEmployeeIdVal" default="0" />
<cfparam name="vertexSaveWebsiteName" default="" />
<cfparam name="vertexSaveAppKeyEncrypted" default="" />
<cfparam name="vertexSavePayload" default="#{}#" />
<cfparam name="encryptionKey" default="" />

<cfset vertexImportResult = {
    "attempted": false,
    "success": false,
    "message": "",
    "data": {}
} />

<cfif NOT isStruct(vertexExtractedData) OR NOT structCount(vertexExtractedData)>
    <cfset vertexImportResult.message = "No extracted_data to save." />
    <cfexit />
</cfif>

<cfset vertexImportResult.attempted = true />

<cftry>
    <cfset importAgencyId = "" />
    <cfset importPatientId = "" />
    <cfset importAssessmentId = "" />
    <cfset importEmpId = "" />
    <cfset importAppKey = "" />
    <cfset importWebsite = trim(vertexSaveWebsiteName & "") />

    <cfif isStruct(vertexPollResultMeta)>
        <cfif structKeyExists(vertexPollResultMeta, "AGENCY_ID") AND len(trim(vertexPollResultMeta.AGENCY_ID & ""))>
            <cfset importAgencyId = trim(vertexPollResultMeta.AGENCY_ID & "") />
        </cfif>
        <cfif structKeyExists(vertexPollResultMeta, "PATIENT_ID") AND len(trim(vertexPollResultMeta.PATIENT_ID & ""))>
            <cfset importPatientId = trim(vertexPollResultMeta.PATIENT_ID & "") />
        </cfif>
        <cfif structKeyExists(vertexPollResultMeta, "ASSESSMENT_ID") AND len(trim(vertexPollResultMeta.ASSESSMENT_ID & ""))>
            <cfset importAssessmentId = trim(vertexPollResultMeta.ASSESSMENT_ID & "") />
        </cfif>
        <cfif structKeyExists(vertexPollResultMeta, "Emp_ID") AND len(trim(vertexPollResultMeta.Emp_ID & ""))>
            <cfset importEmpId = trim(vertexPollResultMeta.Emp_ID & "") />
        </cfif>
        <cfif structKeyExists(vertexPollResultMeta, "appKey") AND len(trim(vertexPollResultMeta.appKey & ""))>
            <cfset importAppKey = trim(vertexPollResultMeta.appKey & "") />
        </cfif>
        <cfif structKeyExists(vertexPollResultMeta, "Website_name") AND len(trim(vertexPollResultMeta.Website_name & ""))>
            <cfset importWebsite = trim(vertexPollResultMeta.Website_name & "") />
        </cfif>
    </cfif>

    <cfif isStruct(vertexSavePayload)>
        <cfif NOT len(importAgencyId) AND structKeyExists(vertexSavePayload, "AGENCY_ID")>
            <cfset importAgencyId = trim(vertexSavePayload.AGENCY_ID & "") />
        </cfif>
        <cfif NOT len(importPatientId) AND structKeyExists(vertexSavePayload, "PATIENT_ID")>
            <cfset importPatientId = trim(vertexSavePayload.PATIENT_ID & "") />
        </cfif>
        <cfif NOT len(importAssessmentId) AND structKeyExists(vertexSavePayload, "ASSESSMENT_ID")>
            <cfset importAssessmentId = trim(vertexSavePayload.ASSESSMENT_ID & "") />
        </cfif>
        <cfif NOT len(importEmpId) AND structKeyExists(vertexSavePayload, "Emp_ID")>
            <cfset importEmpId = trim(vertexSavePayload.Emp_ID & "") />
        </cfif>
        <cfif NOT len(importAppKey) AND structKeyExists(vertexSavePayload, "appKey")>
            <cfset importAppKey = trim(vertexSavePayload.appKey & "") />
        </cfif>
    </cfif>

    <cfif NOT len(importAppKey) AND len(trim(vertexSaveAppKeyEncrypted & ""))>
        <cfset importAppKey = trim(vertexSaveAppKeyEncrypted & "") />
    </cfif>
    <cfif NOT len(importAgencyId) AND structKeyExists(session, "AgencyID") AND len(encryptionKey)>
        <cfset importAgencyId = encrypt(session.AgencyID, encryptionKey, "AES", "Hex") />
    </cfif>
    <cfif NOT len(importPatientId) AND val(vertexSavePatientIdVal) GT 0 AND len(encryptionKey)>
        <cfset importPatientId = encrypt(vertexSavePatientIdVal, encryptionKey, "AES", "Hex") />
    </cfif>
    <cfif NOT len(importAssessmentId) AND len(trim(vertexSaveAssessmentId & "")) AND val(vertexSaveAssessmentId) GT 0 AND len(encryptionKey)>
        <cfset importAssessmentId = encrypt(vertexSaveAssessmentId, encryptionKey, "AES", "Hex") />
    </cfif>
    <cfif NOT len(importEmpId) AND val(vertexSaveEmployeeIdVal) GT 0 AND len(encryptionKey)>
        <cfset importEmpId = encrypt(vertexSaveEmployeeIdVal, encryptionKey, "AES", "Hex") />
    </cfif>
    <cfif NOT len(importWebsite) AND structKeyExists(cgi, "SERVER_NAME")>
        <cfset importWebsite = trim(cgi.SERVER_NAME & "") />
    </cfif>

    <cfset bulkImportPath = expandPath("/components/API/bulk_import_ai.cfc") />
    <cfif NOT fileExists(bulkImportPath)>
        <cfset vertexImportResult.message = "bulk_import_ai.cfc not found." />
        <cfexit />
    </cfif>

    <cfset bulkImportApi = createObject("component", "components.API.bulk_import_ai") />
    <cfset importReturnRaw = bulkImportApi.importPatientData(
        Agency_ID = importAgencyId,
        appkey = importAppKey,
        Emp_ID = importEmpId,
        Patient_ID = importPatientId,
        Assessment_ID = importAssessmentId,
        Website_name = importWebsite,
        extracted_data = vertexExtractedData
    ) />

    <cfset importSnap = {} />
    <cfif isSimpleValue(importReturnRaw) AND len(trim(importReturnRaw)) AND isJSON(importReturnRaw)>
        <cfset importSnap = deserializeJSON(importReturnRaw) />
    <cfelseif isStruct(importReturnRaw)>
        <cfset importSnap = importReturnRaw />
    </cfif>

    <cfset vertexImportResult.data = importSnap />
    <cfif isStruct(importSnap) AND structKeyExists(importSnap, "success") AND importSnap.success>
        <cfset vertexImportResult.success = true />
        <cfset vertexImportResult.message = structKeyExists(importSnap, "message") ? trim(importSnap.message & "") : "Extracted data saved successfully." />
    <cfelse>
        <cfset vertexImportResult.success = false />
        <cfset vertexImportResult.message = (isStruct(importSnap) AND structKeyExists(importSnap, "message")) ? trim(importSnap.message & "") : "Failed to save extracted data." />
    </cfif>

    <!--- Sync medications from AI table (patient ID only; SOC/assessment not required) --->
    <cfif vertexImportResult.success AND val(vertexSavePatientIdVal) GT 0>
        <cfset request.med_sync_patient_id = val(vertexSavePatientIdVal) />
        <cfset request.med_sync_employee_id = val(vertexSaveEmployeeIdVal) />
        <cftry>
            <cfinclude template="sync_ai_medications.cfm" />
            <cfif structKeyExists(request, "med_sync_result")>
                <cfset vertexImportResult.data.medicationSync = request.med_sync_result />
            </cfif>
            <cfcatch type="any">
                <cfset vertexImportResult.data.medicationSync = { "success": false, "message": cfcatch.message } />
            </cfcatch>
        </cftry>
    </cfif>

    <!--- Sync problems still require a valid assessment ID --->
    <cfif vertexImportResult.success AND val(vertexSavePatientIdVal) GT 0 AND val(vertexSaveAssessmentId) GT 0>
        <cfset request.problems_sync_patient_id = val(vertexSavePatientIdVal) />
        <cfset request.problems_sync_assmt_id = val(vertexSaveAssessmentId) />
        <cfset request.problems_sync_employee_id = val(vertexSaveEmployeeIdVal) />
        <cftry>
            <cfinclude template="sync_problems_action.cfm" />
            <cfif structKeyExists(request, "problems_sync_result")>
                <cfset vertexImportResult.data.problemsSync = request.problems_sync_result />
            </cfif>
            <cfcatch type="any">
                <cfset vertexImportResult.data.problemsSync = { "success": false, "message": cfcatch.message } />
            </cfcatch>
        </cftry>
    </cfif>

    <cfcatch type="any">
        <cfset vertexImportResult.success = false />
        <cfset vertexImportResult.message = "Save extracted_data failed: " & cfcatch.message />
        <cfset vertexImportResult.data = { "error": cfcatch.message } />
    </cfcatch>
</cftry>
