<cfcomponent displayname="OASIS check" hint="I return OASIS check" output="false">

	<cfset client.Loc_ID = #session.agencyid# />
	
   	<cffunction name="init" displayname="Initialize Component" access="public" returntype="any" hint="I initialize and return the Oasis check object.">
		<cfreturn this>
	</cffunction>

	<cffunction name="OASISalert"  access="remote" output="Yes" httpmethod="POST" returnformat="JSON">
	      <cfargument name="patid" required="no" default="0"  hint="patient_ID" >
	      <cfargument name="assid" required="yes" default="0"  hint="AssessmentId">
	      <cfargument name="Loc_ID" required="no" hint="Loc_ID" default="#client.Loc_ID#"> 
	      <cfargument name="wizard" required="yes" default="0"  hint="wizard">
	      <cfargument name="assessment_reason" required="yes" default="0"  hint="AssessmentReason">
	      <cfargument name="answers" required="yes" hint="Assesments form creation">

	      <cfset data=ArrayNew(1) />
		  <cfset datalist=ArrayNew(2) />
		  <cfset datalist=ListToArray(answers,"~",false,true) />


	      <cfset client.Loc_ID = session.agencyid />
		    <cfquery  name="getoasis_lookup" datasource="#Application.DataSrc#">
	           SELECT * FROM #Request.prefix_db_lookup#.oasis_lookup
	           WHERE status =  <cfqueryparam cfsqltype="cf_sql_integer" value="0">
	           AND  assessment = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.assessment_reason#">
	           AND wizard =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.wizard#">
		    </cfquery>

		    <cfset Request.errormessages = '' />
		    	<cfset condtion =  0 />
		    	<cfif  getoasis_lookup.recordcount gt 0 >
		    	<cfloop query="getoasis_lookup">
		    	   <cfloop from="1" to="#ArrayLen(datalist)#" index="i" step="2">
		    	   		<cfif answer_label1 EQ #datalist[i]#  AND  answer1 EQ #datalist[i+1]# >
			    	   	  	<cfset condtion = condtion + 1 />
				      	</cfif>
				      	<cfif answer_label2 EQ #datalist[i]#  AND  answer2 EQ #datalist[i+1]# >
			    	   	  	<cfset condtion = condtion + 1 />
				      	</cfif>				      
		    	   </cfloop>
			        <cfif condtion EQ 2 >
			        	<cfset Request.errormessages  = Request.errormessages & #getoasis_lookup.alerttext# & '<br>' />
			        </cfif>
				</cfloop>
			 	<cfset response_key={"statusCode"= 200,"statusText"= 'failure',"data"= '#Request.errormessages#' } />
			 <cfelse>
			 	<cfset response_key={"statusCode"= 200,"statusText"= 'success',"data"= '' } />
			 </cfif>
			<cfreturn  response_key >
	</cffunction>


	<cffunction name="OASIS_Error_Check"  access="remote" output="Yes" httpmethod="POST" returnformat="JSON">
	      <cfargument name="assid" required="yes" default="0"  hint="AssessmentId">
	      <cfargument name="wizard" required="yes" default="0"  hint="wizard">
	      <cfargument name="assessment_reason" required="yes" default="0"  hint="AssessmentReason">
	      <cfargument name="answers" required="yes" hint="Assesments form creation">

		    <cfset data=ArrayNew(1) />
			<cfset datalist=ArrayNew(2) />
			<cfset datalist=ListToArray(answers,"~",false,true) />

		    <cfquery  name="geterror" datasource="#Application.DataSrc#">
	           SELECT * FROM #Request.prefix_db_lookup#.OASIS_Error_Check
	           WHERE status =  <cfqueryparam cfsqltype="cf_sql_integer" value="0">
	           AND  Assessment = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.assessment_reason#">
	           AND Page_No =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.wizard#">
		    </cfquery>

		    <cfset Request.errormessages = '' />
		    <cfset answerMap = {}>
			<cfset ids =  ''>
		    <cfif  geterror.recordcount gt 0 >
		    	<cfloop from="1" to="#arrayLen(datalist)#" index="i" step="2">
				    <cfif i + 1 LTE arrayLen(datalist)>
				        <cfset code = datalist[i]>
				        <cfset value = urlDecode(datalist[i + 1])>
				        <cfset answerMap[code] = value>
				    </cfif>
				</cfloop>
				<cfoutput query="geterror">
					<cfset F_Answer_value = "" />
					<cfset F_Answer2_value = "" />
					
					<!--- Get F_Item value from answerMap or pAssessments table --->
					<cfif structKeyExists(answerMap, geterror.F_Item)>
						<cfset F_Answer_value = answerMap[geterror.F_Item] />
					<cfelse>
						<!--- Get from pAssessments table --->
						<cfquery name="getF_Item_value" datasource="#Application.DataSrc#">
							SELECT #geterror.F_Item# as F_Item_value
							FROM #Request.prefix_db_agency#.pAssessments 
							WHERE Assmt_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.assid#">
							AND status = 0
						</cfquery>
						<cfif getF_Item_value.recordcount gt 0>
							<cfset F_Answer_value = getF_Item_value.F_Item_value />
						</cfif>
					</cfif>
					
					<!--- Get F_Item2 value from answerMap or pAssessments table --->
					<cfif structKeyExists(answerMap, geterror.F_Item2)>
						<cfset F_Answer2_value = answerMap[geterror.F_Item2] />
					<cfelse>
						<!--- Get from pAssessments table --->
						<cfquery name="getF_Item2_value" datasource="#Application.DataSrc#">
							SELECT #geterror.F_Item2# as F_Item2_value
							FROM #Request.prefix_db_agency#.pAssessments 
							WHERE Assmt_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.assid#">
							AND status = 0
						</cfquery>
						<cfif getF_Item2_value.recordcount gt 0>
							<cfset F_Answer2_value = getF_Item2_value.F_Item2_value />
						</cfif>
					</cfif>
					
					<cfif F_Answer_value NEQ "" AND F_Answer2_value NEQ "">
						<cfquery  name="getalerts" dbtype="query">
					        SELECT * FROM geterror
					        WHERE F_Item  =  '#geterror.F_Item#'
					        AND  (F_Answer = '#F_Answer_value#' OR F_Answer = '#LEFT(F_Answer_value,1)#')
					        AND  F_Item2  =  '#geterror.F_Item2#'
					        AND (F_Answer_2 = '#F_Answer2_value#' OR F_Answer_2 = '#LEFT(F_Answer2_value,1)#')
						</cfquery>
						<cfif getalerts.recordcount gt 0>
							<cfset ids = listAppend(ids, getalerts.ID)>
				        </cfif>	
			        </cfif>			
				</cfoutput>

				<cfif len(ids) gt 0>
					<cfquery  name="getfinalalerts" dbtype="query">
				        SELECT * FROM geterror
				        WHERE ID IN (#ids#) ORDER BY Message ASC
					</cfquery>
					<cfoutput query="getfinalalerts" group="Message">
		        		<cfset Request.errormessages  = Request.errormessages & #Message# & '<br>' />
		        	</cfoutput>
			    </cfif>	

			 	<cfset response_key={"statusCode"= 200,"statusText"= 'failure',"data"= '#Request.errormessages#' } />
			 <cfelse>
			 	<cfset response_key={"statusCode"= 200,"statusText"= 'success',"data"= '' } />
			 </cfif>
			<cfreturn  response_key >
	</cffunction>

	<cffunction name="ensureOasisErrorDbContext" access="private" returntype="void" output="false">
		<cfif NOT structKeyExists(Request, "prefix_db_lookup") OR NOT len(trim(Request.prefix_db_lookup))>
			<cfset Request.prefix_db_lookup = "hhapowerpath" />
		</cfif>
		<cfif NOT structKeyExists(Request, "prefix_db_agency") OR Request.prefix_db_agency EQ "prefix_db_agency_invalid">
			<cfif structKeyExists(session, "AgencyId") AND len(session.AgencyId)>
				<cfset Request.prefix_db_agency = "agency_" & session.AgencyId />
			</cfif>
		</cfif>
	</cffunction>

	<!--- #10464: add answer_label / ques_identifier aliases so edit view can match DOM --->
	<cffunction name="expandOasisFieldErrorKeys" access="private" returntype="struct" output="false">
		<cfargument name="fieldErrors" type="struct" required="true" />
		<cfargument name="assessment_reason" type="string" required="true" />

		<cfset var expanded = duplicate(arguments.fieldErrors) />
		<cfset var lookupQ = "" />
		<cfset var fKey = "" />
		<cfset var msg = "" />

		<cfif NOT structCount(arguments.fieldErrors)>
			<cfreturn expanded />
		</cfif>

		<cfquery name="lookupQ" datasource="#Application.DataSrc#">
			SELECT DISTINCT answer_label, ques_identifier
			FROM #Request.prefix_db_lookup#.assessment_questions_lookup
			WHERE assessment_reason = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.assessment_reason#" />
			AND Deleted = 0
		</cfquery>

		<cfloop collection="#arguments.fieldErrors#" item="fKey">
			<cfset msg = arguments.fieldErrors[fKey] />
			<cfloop query="lookupQ">
				<cfif ucase(lookupQ.answer_label) EQ ucase(fKey) AND len(trim(lookupQ.ques_identifier))>
					<cfset expanded[lookupQ.ques_identifier] = msg />
				</cfif>
				<cfif len(trim(lookupQ.ques_identifier)) AND ucase(lookupQ.ques_identifier) EQ ucase(fKey)>
					<cfset expanded[lookupQ.answer_label] = msg />
				</cfif>
				<cfif len(trim(lookupQ.ques_identifier)) AND findNoCase("(#lookupQ.ques_identifier#)", msg)>
					<cfset expanded[lookupQ.answer_label] = msg />
				</cfif>
			</cfloop>
		</cfloop>

		<cfreturn expanded />
	</cffunction>

	<!--- #10464: per-field OASIS errors for Assessment Edit view (keyed by F_Item / answer_label) --->
	<cffunction name="get_OASIS_field_errors" access="public" returntype="struct" output="false">
		<cfargument name="assid" required="yes" type="numeric" hint="AssessmentId" />
		<cfargument name="assessment_reason" required="yes" type="string" hint="AssessmentReason" />
		<cfargument name="wizard" required="no" type="numeric" default="0" hint="wizard page; 0 = all pages (edit view)" />
		<cfargument name="answers" required="no" type="string" default="" hint="label~value~ pairs from current form" />

		<cfset var fieldErrors = {} />
		<cfset var geterror = "" />
		<cfset var getalerts = "" />
		<cfset var getfinalalerts = "" />
		<cfset var ids = "" />
		<cfset var F_Answer_value = "" />
		<cfset var F_Answer2_value = "" />
		<cfset var getF_Item_value = "" />
		<cfset var getF_Item2_value = "" />
		<cfset var answerMap = {} />
		<cfset var datalist = [] />
		<cfset var i = 0 />

		<cfset ensureOasisErrorDbContext() />

		<cfif len(trim(arguments.answers))>
			<cfset datalist = listToArray(arguments.answers, "~", false, true) />
			<cfloop from="1" to="#arrayLen(datalist)#" index="i" step="2">
				<cfif i + 1 LTE arrayLen(datalist)>
					<cfset answerMap[datalist[i]] = urlDecode(datalist[i + 1]) />
				</cfif>
			</cfloop>
		</cfif>

		<cfquery name="geterror" datasource="#Application.DataSrc#">
			SELECT * FROM #Request.prefix_db_lookup#.OASIS_Error_Check
			WHERE status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
			AND Assessment = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.assessment_reason#">
			<cfif arguments.wizard GT 0>
				AND Page_No = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.wizard#">
			</cfif>
		</cfquery>

		<cfif geterror.recordcount EQ 0>
			<cfreturn fieldErrors />
		</cfif>

		<cfoutput query="geterror">
			<cfset F_Answer_value = "" />
			<cfset F_Answer2_value = "" />

			<cfif structKeyExists(answerMap, geterror.F_Item)>
				<cfset F_Answer_value = answerMap[geterror.F_Item] />
			<cfelse>
				<cfquery name="getF_Item_value" datasource="#Application.DataSrc#">
					SELECT #geterror.F_Item# AS F_Item_value
					FROM #Request.prefix_db_agency#.pAssessments
					WHERE Assmt_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.assid#">
					AND status = 0
				</cfquery>
				<cfif getF_Item_value.recordcount GT 0>
					<cfset F_Answer_value = getF_Item_value.F_Item_value />
				</cfif>
			</cfif>

			<cfif structKeyExists(answerMap, geterror.F_Item2)>
				<cfset F_Answer2_value = answerMap[geterror.F_Item2] />
			<cfelse>
				<cfquery name="getF_Item2_value" datasource="#Application.DataSrc#">
					SELECT #geterror.F_Item2# AS F_Item2_value
					FROM #Request.prefix_db_agency#.pAssessments
					WHERE Assmt_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.assid#">
					AND status = 0
				</cfquery>
				<cfif getF_Item2_value.recordcount GT 0>
					<cfset F_Answer2_value = getF_Item2_value.F_Item2_value />
				</cfif>
			</cfif>

			<cfif F_Answer_value NEQ "" AND F_Answer2_value NEQ "">
				<cfquery name="getalerts" dbtype="query">
					SELECT * FROM geterror
					WHERE F_Item = '#geterror.F_Item#'
					AND (F_Answer = '#F_Answer_value#' OR F_Answer = '#LEFT(F_Answer_value,1)#')
					AND F_Item2 = '#geterror.F_Item2#'
					AND (F_Answer_2 = '#F_Answer2_value#' OR F_Answer_2 = '#LEFT(F_Answer2_value,1)#')
				</cfquery>
				<cfif getalerts.recordcount GT 0>
					<cfset ids = listAppend(ids, getalerts.ID) />
				</cfif>
			</cfif>
		</cfoutput>

		<cfif len(ids) GT 0>
			<cfquery name="getfinalalerts" dbtype="query">
				SELECT * FROM geterror
				WHERE ID IN (#ids#)
				ORDER BY Message ASC
			</cfquery>
			<cfloop query="getfinalalerts">
				<cfif NOT structKeyExists(fieldErrors, getfinalalerts.F_Item)>
					<cfset fieldErrors[getfinalalerts.F_Item] = "" />
				</cfif>
				<cfif NOT findNoCase(getfinalalerts.Message, fieldErrors[getfinalalerts.F_Item])>
					<cfif len(fieldErrors[getfinalalerts.F_Item])>
						<cfset fieldErrors[getfinalalerts.F_Item] = fieldErrors[getfinalalerts.F_Item] & "<br>" />
					</cfif>
					<cfset fieldErrors[getfinalalerts.F_Item] = fieldErrors[getfinalalerts.F_Item] & getfinalalerts.Message />
				</cfif>
			</cfloop>
		</cfif>

		<cfreturn expandOasisFieldErrorKeys(fieldErrors, arguments.assessment_reason) />
	</cffunction>

	<cffunction name="get_OASIS_field_errors_json" access="remote" returnformat="json" output="false" httpmethod="GET,POST">
		<cfargument name="assid" required="yes" type="numeric" />
		<cfargument name="assessment_reason" required="yes" type="string" />
		<cfargument name="wizard" required="no" type="numeric" default="0" />
		<cfargument name="answers" required="no" type="string" default="" />

		<cfset var fieldMap = {} />
		<cfset var fieldKey = "" />
		<cfset var out = [] />

		<cfset ensureOasisErrorDbContext() />

		<cfset fieldMap = get_OASIS_field_errors(arguments.assid, arguments.assessment_reason, arguments.wizard, arguments.answers) />
		<cfloop collection="#fieldMap#" item="fieldKey">
			<cfset arrayAppend(out, {"field": fieldKey, "message": fieldMap[fieldKey]}) />
		</cfloop>
		<cfreturn out />
	</cffunction>

</cfcomponent>