<cfcomponent displayname="Billing SFTP" hint="Centralized SFTP settings for billing/Inovalon (Ability Network)" output="false">

	<!--- Shared HCBS (hcbserv) Inovalon production SFTP --->
	<cfset variables.HCBS_SHARED_CONNECTION = {
		Server = "sftp-prod.accessrcm.abilitynetwork.com",
		Port = "22",
		Username = "hcbserv",
		Password = "mbB4rQfnJI",
		Secure = true
	} />

	<!--- Agency-specific SFTP settings keyed by Agency_ID --->
	<cfset variables.AGENCY_CONNECTIONS = {} />
	<!--- Sienna (1193) - HCBS shared account --->
	<cfset variables.AGENCY_CONNECTIONS["1193"] = duplicate(variables.HCBS_SHARED_CONNECTION) />
	<!--- Sienna legacy id (1192) - HCBS shared account --->
	<cfset variables.AGENCY_CONNECTIONS["1192"] = duplicate(variables.HCBS_SHARED_CONNECTION) />
	<!--- Evergreen HC Group Inc DBA Evergreen Home Health (1195) --->
	<cfset variables.AGENCY_CONNECTIONS["1195"] = {
		Server = "sftp-prod.accessrcm.abilitynetwork.com",
		Port = "22",
		Username = "ehg1104077",
		Password = "EjOV5QuwFb",
		Secure = true
	} />

	<cffunction name="getConnectionProperties" access="public" returntype="struct" hint="Returns cfftp attributeCollection struct for the given agency">
		<cfargument name="agencyId" type="any" required="false" default="">
		<cfset var agencyKey = toString(val(arguments.agencyId)) />
		<cfif len(agencyKey) AND structKeyExists(variables.AGENCY_CONNECTIONS, agencyKey)>
			<cfreturn duplicate(variables.AGENCY_CONNECTIONS[agencyKey]) />
		</cfif>
		<cfreturn duplicate(variables.HCBS_SHARED_CONNECTION) />
	</cffunction>

	<cffunction name="usesDedicatedConnection" access="public" returntype="boolean" hint="True when agency has its own SFTP account (not hcbserv)">
		<cfargument name="agencyId" type="any" required="true">
		<cfset var agencyKey = toString(val(arguments.agencyId)) />
		<cfif NOT len(agencyKey) OR NOT structKeyExists(variables.AGENCY_CONNECTIONS, agencyKey)>
			<cfreturn false />
		</cfif>
		<cfreturn variables.AGENCY_CONNECTIONS[agencyKey].Username NEQ variables.HCBS_SHARED_CONNECTION.Username />
	</cffunction>

	<cffunction name="getDedicatedAgencyIdList" access="public" returntype="string" hint="Comma list of agency IDs with dedicated SFTP accounts">
		<cfset var agencyKey = "" />
		<cfset var dedicatedIds = "" />
		<cfloop collection="#variables.AGENCY_CONNECTIONS#" item="agencyKey">
			<cfif usesDedicatedConnection(agencyKey)>
				<cfset dedicatedIds = listAppend(dedicatedIds, agencyKey) />
			</cfif>
		</cfloop>
		<cfreturn dedicatedIds />
	</cffunction>

	<cffunction name="getImportConnections" access="public" returntype="array" hint="Unique SFTP connections for batch import cron jobs">
		<cfset var result = [] />
		<cfset var seenUsernames = {} />
		<cfset var agencyKey = "" />
		<cfset var conn = {} />

		<cfset arrayAppend(result, {
			connection = duplicate(variables.HCBS_SHARED_CONNECTION),
			dedicatedAgencyId = ""
		}) />
		<cfset seenUsernames[variables.HCBS_SHARED_CONNECTION.Username] = true />

		<cfloop collection="#variables.AGENCY_CONNECTIONS#" item="agencyKey">
			<cfset conn = variables.AGENCY_CONNECTIONS[agencyKey] />
			<cfif conn.Username NEQ variables.HCBS_SHARED_CONNECTION.Username AND NOT structKeyExists(seenUsernames, conn.Username)>
				<cfset arrayAppend(result, {
					connection = duplicate(conn),
					dedicatedAgencyId = agencyKey
				}) />
				<cfset seenUsernames[conn.Username] = true />
			</cfif>
		</cfloop>
		<cfreturn result />
	</cffunction>

	<cffunction name="shouldProcessAgencyFile" access="public" returntype="boolean" hint="Filters batch import files by SFTP connection scope">
		<cfargument name="agencyId" type="any" required="true">
		<cfargument name="dedicatedAgencyId" type="string" required="false" default="">
		<cfset var agencyKey = toString(val(arguments.agencyId)) />
		<cfif len(arguments.dedicatedAgencyId)>
			<cfreturn agencyKey EQ arguments.dedicatedAgencyId />
		</cfif>
		<cfreturn NOT usesDedicatedConnection(agencyKey) />
	</cffunction>

</cfcomponent>
