<cfparam name="url.redirect" default="">
<cfparam name="url.Emp_ID" default="">
<cfparam name="url.faxmemo" default="">
<cfparam name="url.faxsubject" default="">
<cfparam name="url.otherfaxnumber" default="">
<cfparam name="url.afid" default="">
<cfparam name="url.Comm_ID" default="">
<cfparam name="url.Event_ID" default="">
<cfparam name="url.filetype" default="">
<cfparam name="url.file_id" default="">
<cfparam name="url.pid" default="">
<cfparam name="url.aid" default="0">

<!--- Debug ColdFusion version and PDF capabilities --->
<cflog file="fax_debug" text="ColdFusion Version: #Server.ColdFusion.ProductVersion#">
<cflog file="fax_debug" text="Server OS: #Server.OS.Name# #Server.OS.Version#">
<cflog file="fax_debug" text="Working Directory: #GetCurrentTemplatePath()#">

<!--- Get agency information for fax cover page - Must be done first --->
<cfquery name="formagency" datasource="#Application.DataSrc#">
	SELECT Agency_Name, Agency_Address1, Agency_City, Agency_State, Agency_Zip, 
		   Agency_Contact_Phone, Agency_Fax 
	FROM #Request.prefix_db_lookup#.Agency 
	WHERE Agency_ID = '#session.AgencyID#'
</cfquery>
<!--- Set the function & Fax Service Response Parameters --->
<cfif url.Emp_ID EQ 'other'>
	<cfset fax_number =   #url.otherfaxnumber# />
	<cfset LOCAL.ToName = #url.otherfaxnumber#  />
	<!--- Set empty physician information for custom fax numbers --->
	<cfset LOCAL.Physician_First_Name = "" />
	<cfset LOCAL.Physician_Last_Name = "" />
	<cfset LOCAL.Physician_Credentials = "" />
<cfelse>
	<cfquery name="Get485_phys" datasource="#Application.DataSrc#">
		SELECT * FROM  #Request.prefix_db_lookup#.pPhysicians
		WHERE Emp_ID = '#url.Emp_ID#' AND status =0 
	</cfquery>
	<cfset fax_number = #Get485_phys.Phys_Fax# />
	<cfset LOCAL.ToName = #Get485_phys.Phys_First# />
	<!--- Set physician information for fax cover template --->
	<cfset LOCAL.Physician_First_Name = #Get485_phys.Phys_First# />
	<cfset LOCAL.Physician_Last_Name = #Get485_phys.Phys_Last# />
	<cfset LOCAL.Physician_Credentials = #Get485_phys.Phys_Credentials# />
</cfif>
<!--- Fax Cover Template - This will be the first page of the fax --->
<cfif url.filetype NEQ ''>
	<!--- Check if agency logo exists --->
	<cfset logo_path = '/var/www/datafiles/Agency_Logos/#session.AgencyID#.png'>
	<cfset logo_exists = FileExists(logo_path)>
	<!--- Store the fax cover template for use in fax generation --->
	<cfset Request.logo_exists = logo_exists>
	<cfset Request.logo_path = logo_path>
</cfif>
<!--- Fax cover page generation moved to each section for proper timestamping --->
<cfset coverpage = "Professional fax transmission with cover page included.">
<cfscript>
	 request.fax = CreateObject("component","components.general.fax").init();
</cfscript>
<cfif len(fax_number) LT 10 >
	<p>Fax number is Invalid or not available for selected employee </p>
<cfelseif url.filetype  EQ 'fax_4857'>
	<!--- Generate fax cover page for this specific fax --->
	<cfset cover_filename = '/var/www/faxfiles/cover_' & #DateTimeFormat(now(),'yyyymmddhhmmss')# & '.pdf' />
	<cfdocument format="pdf" filename="#cover_filename#" overwrite="yes" 
		marginleft="0.5" marginright="0.5" margintop="0.5" marginbottom="0.5">
		<cfinclude template ="fax_cover_template.cfm" />
	</cfdocument>
	
	<cfset filename =  '/var/www/faxfiles/'& #DateTimeFormat(now(),'yyyymmddhhmmss')# & '.pdf' />
	
    <!--- Generate the main document --->
	<cfinclude template = "fax_4857.cfm" />
	<!--- Combine cover page with main document --->
	<cfset final_filename = '/var/www/faxfiles/final_' & #DateTimeFormat(now(),'yyyymmddhhmmss')# & '.pdf' />
	
	<!--- Check if both source files exist before merging --->
	<cfif FileExists(cover_filename) AND FileExists(filename)>
		<!--- Log file information for debugging --->
		<cfset cover_size = GetFileInfo(cover_filename).size>
		<cfset main_size = GetFileInfo(filename).size>
		<cflog file="fax_debug" text="PDF Merge Debug - Cover: #cover_filename# (#cover_size# bytes), Main: #filename# (#main_size# bytes)">
		
		<!--- Validate that files are not empty --->
		<cfif cover_size GT 0 AND main_size GT 0>
			<cftry>
				<!--- Try to read the PDF files to validate they are accessible --->
				<cfset cover_content = FileReadBinary(cover_filename)>
				<cfset main_content = FileReadBinary(filename)>
				
				<cfpdf action="merge" source="#cover_filename#,#filename#" destination="#final_filename#">
				<cflog file="fax_debug" text="PDF Merge Success - Final: #final_filename#">
				<cfset filename = final_filename>
				<cfif session.agencyid EQ '1150' OR session.agencyid EQ '1163'>
					<cfset fax_status =  request.fax.send_fax('#fax_number#','#filename#','#coverpage#') />
				<cfelse>
					<cfset fax_status =  request.fax.send_fax('#fax_number#','#filename#','#coverpage#') />
				</cfif>
 				<cfif fax_status EQ 'success'>
					<cfquery name="GetV" datasource="#Application.DataSrc#">
						UPDATE #Request.prefix_db_agency#.pCMS4857 
						SET  Form_Status  = 'Sent via Fax',
						Date_Sent = #now()#,
						<cfif url.Emp_ID NEQ 'other'>
							fax_send_phys_id = #Get485_phys.Phys_ID#,
						</cfif>
						fax_send_to = '#LOCAL.ToName#'
						WHERE Order_ID = '#url.afid#'
					</cfquery>
					<cfset message = "Successfully send Fax to #LOCAL.ToName#" />
					<cffile action="delete" file="#cover_filename#">
					<cffile action="delete" file="#filename#">
				<cfelse>
					<cfset message = "Failure due to FAX send API error" />
				</cfif>	
				<cfcatch type="any">
					<cflog file="fax_debug" text="PDF Merge Error: #cfcatch.message# - Detail: #cfcatch.detail#">
					<cfset message = "PDF merge failed: #cfcatch.message#">
				</cfcatch>
			</cftry>
		<cfelse>
			<cflog file="fax_debug" text="PDF Merge Files Empty - Cover size: #cover_size#, Main size: #main_size#">
			<cfset message = "Source files are empty or invalid for PDF merge">
		</cfif>
	<cfelse>
		<cflog file="fax_debug" text="PDF Merge Files Missing - Cover exists: #FileExists(cover_filename)#, Main exists: #FileExists(filename)#">
		<cfset message = "Source files not found for PDF merge">
	</cfif>
	<cfif url.redirect EQ 'communicationlog' OR url.redirect EQ 'unsentorders'>
		<cflocation url="../dashboard/index.cfm?page=dashboard&cat&rpt=unsent_orders&message=#message#" addtoken="no">
	<cfelse>
		<cflocation url="../patientadmin_new/index.cfm?a=1&page=patient&px=y&cat=#formredirection#&afid=#afid#&message=#message#" addtoken="no">
	</cfif>
<cfelseif url.filetype  EQ 'Incidence'>
	<!--- Generate fax cover page for this specific fax --->
	<cfset cover_filename = '/var/www/faxfiles/cover_' & #DateTimeFormat(now(),'yyyymmddhhmmss')# & '.pdf' />
	<cfdocument format="pdf" filename="#cover_filename#" overwrite="yes" 
		marginleft="0.5" marginright="0.5" margintop="0.5" marginbottom="0.5">
		<cfinclude template ="fax_cover_template.cfm" />
	</cfdocument>
	
	<cfset filename =  '/var/www/faxfiles/'& #DateTimeFormat(now(),'yyyymmddhhmmss')# & '.pdf' />
	<cfset Request.print = "no">
	<cfset url.ID = url.Event_ID />
	
    <!--- Generate the main document --->
	<cfinclude template ="/agencyadmin/event_form_printer.cfm">
	
	<!--- Combine cover page with main document --->
	<cfset final_filename = '/var/www/faxfiles/final_' & #DateTimeFormat(now(),'yyyymmddhhmmss')# & '.pdf' />
	<cfpdf action="merge" source="#cover_filename#,#filename#" destination="#final_filename#">
	
	<!--- Clean up individual files --->
	<cffile action="delete" file="#cover_filename#">
	<cffile action="delete" file="#filename#">
	
	<!--- Use the combined file for faxing --->
	<cfset filename = final_filename>
	
	<!--- <cfif len(url.faxmemo) EQ 0>
		<cfset coverpage =  #session.display#  & " has sent Incidence files"  />
	</cfif> --->
	<cfif session.agencyid EQ '1150' OR session.agencyid EQ '1163'>
		<cfset fax_status =  request.fax.send_fax('#fax_number#','#filename#','#coverpage#') />
	<cfelse>
		<cfset fax_status =  request.fax.send_fax('#fax_number#','#filename#','#coverpage#') />
	</cfif>
	<cfif fax_status EQ 'success'>
		<!--- Update Event table with fax information --->
		<cfquery name="UpdateEvent" datasource="#Application.DataSrc#">
			UPDATE #Request.prefix_db_agency#.Event 
			SET fax_send_to = <cfqueryparam cfsqltype="cf_sql_varchar" value="#fax_number#">,
				fax_sent_time = <cfqueryparam cfsqltype="cf_sql_timestamp" value="#now()#">
			WHERE Event_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#url.Event_ID#">
		</cfquery>
		<cfset message = "Successfully send Fax to #LOCAL.ToName#" />
		<cffile   action="delete"  file="#filename#">
	<cfelse>
		<cfset message = "Failure due to FAX send API error" />
	</cfif>
	<cflocation url="../dashboard/index.cfm?page=dashboard&cat&rpt=unsent_orders&message=#message#" addtoken="no">
<cfelseif url.filetype EQ 'unsent_orders' OR url.filetype EQ 'communication_log'>
	<!--- Generate fax cover page for this specific fax --->
	<cfset cover_filename = '/var/www/faxfiles/cover_' & #DateTimeFormat(now(),'yyyymmddhhmmss')# & '.pdf' />
	<cfdocument format="pdf" filename="#cover_filename#" overwrite="yes" 
		marginleft="0.5" marginright="0.5" margintop="0.5" marginbottom="0.5">
		<cfinclude template ="fax_cover_template.cfm" />
	</cfdocument>
	
	<cfset filename =  '/var/www/faxfiles/'& #DateTimeFormat(now(),'yyyymmddhhmmss')# & '.pdf' />
	<!--- Generate the main document --->
	<cfinclude template ="/agencyadmin/comm_pdf.cfm">
	
	<!--- Combine cover page with main document --->
	<cfset final_filename = '/var/www/faxfiles/final_' & #DateTimeFormat(now(),'yyyymmddhhmmss')# & '.pdf' />
	
	<!--- Check if both source files exist before merging --->
	<cfif FileExists(cover_filename) AND FileExists(filename)>
		<cftry>
			<cfpdf action="merge" source="#cover_filename#,#filename#" destination="#final_filename#">
			<cfcatch type="any">
				<cfset message = "PDF merge failed: #cfcatch.message#">
				<cfif url.filetype EQ 'communication_log'>
					<cflocation url="../agencyadmin/index.cfm?page=agency&cat=Communication&rpt=#url.filetype#&res=No&mylog=y&assignee=y&mytodo=y&message=#message#" addtoken="no">
				<cfelseif url.filetype EQ 'unsent_orders'>
					<cflocation url="../dashboard/index.cfm?page=dashboard&cat&rpt=unsent_orders&message=#message#" addtoken="no">
				<cfelse>
					<cflocation url="../dashboard/index.cfm?page=dashboard&cat&rpt=#url.filetype#&message=#message#" addtoken="no">
				</cfif>
			</cfcatch>
		</cftry>
	<cfelse>
		<cfset message = "Source files not found for PDF merge">
		<cfif url.filetype EQ 'communication_log'>
			<cflocation url="../agencyadmin/index.cfm?page=agency&cat=Communication&rpt=#url.filetype#&res=No&mylog=y&assignee=y&mytodo=y&message=#message#" addtoken="no">
		<cfelseif url.filetype EQ 'unsent_orders'>
			<cflocation url="../dashboard/index.cfm?page=dashboard&cat&rpt=unsent_orders&message=#message#" addtoken="no">
		<cfelse>
			<cflocation url="../dashboard/index.cfm?page=dashboard&cat&rpt=#url.filetype#&message=#message#" addtoken="no">
		</cfif>
	</cfif>
	
	<!--- Clean up individual files --->
	<cffile action="delete" file="#cover_filename#">
	<cffile action="delete" file="#filename#">
	
	<!--- Use the combined file for faxing --->
	<cfset filename = final_filename>
	
	<cfif session.agencyid EQ '1150' OR session.agencyid EQ '1163'>
		<cfset fax_status =  request.fax.send_fax('#fax_number#','#filename#','#coverpage#') />
	<cfelse>
		<cfset fax_status =  request.fax.send_fax('#fax_number#','#filename#','#coverpage#') />
	</cfif>
	<cfif fax_status EQ 'success'>
		<cfset message = "Successfully send Fax to #LOCAL.ToName#" />
		<cfquery name="Comm" datasource="#Application.DataSrc#">
                UPDATE #Request.prefix_db_agency#.Communication 
                SET  send_fax = 1, 
                fax_sent_date =  #now()# 
                WHERE Comm_ID = <cfqueryparam VALUE="#URL.Comm_ID#"  cfsqltype="cf_sql_integer" >
        </cfquery>
		<cffile   action="delete"  file="#filename#">
	<cfelse>
		<cfset message = "Failure due to FAX send API error" />
	</cfif>
	<cfif url.filetype EQ 'communication_log'>
		<cflocation url="../agencyadmin/index.cfm?page=agency&cat=Communication&rpt=#url.filetype#&res=No&mylog=y&assignee=y&mytodo=y&message=#message#" addtoken="no">
	<cfelseif url.filetype EQ 'unsent_orders'>
		<cflocation url="../dashboard/index.cfm?page=dashboard&cat&rpt=unsent_orders&message=#message#" addtoken="no">
	<cfelse>
		<cflocation url="../dashboard/index.cfm?page=dashboard&cat&rpt=#url.filetype#&message=#message#" addtoken="no">
	</cfif>

<cfelseif url.filetype  EQ 'pat_files' OR  url.filetype  EQ 'pg_files'>
		<!--- Generate fax cover page for this specific fax --->
		<cfset cover_filename = '/var/www/faxfiles/cover_' & #DateTimeFormat(now(),'yyyymmddhhmmss')# & '.pdf' />
		<cfdocument format="pdf" filename="#cover_filename#" overwrite="yes" 
			marginleft="0.5" marginright="0.5" margintop="0.5" marginbottom="0.5">
			<cfinclude template ="fax_cover_template.cfm" />
		</cfdocument>
		
		<cfset filename =  '/var/www/faxfiles/'& #DateTimeFormat(now(),'yyyymmddhhmmss')# & '.pdf' />
		<cfif len(url.faxmemo) EQ 0>
			<cfset coverpage =  #session.display#  & " has sent patient uploaded files"  />
		</cfif>
		 
		<cfif url.filetype  EQ 'pat_files'>
			<cfquery  name='getFile' datasource='#Application.DataSrc#'>
			  	SELECT  files.*,pPatients.Pt_Last,pPatients.Pt_First 
			  	FROM  #Request.prefix_db_agency#.files
			  	JOIN  #Request.prefix_db_agency#.pPatients ON pPatients.Patient_ID = files.PatientId AND pPatients.status < 2
			  	WHERE files.id IN (#url.file_id#)
			  	AND   files.AgencyId = '#session.AgencyId#'
			</cfquery>		
			<cfset path = 'Patient_files/agency_'&#session.AgencyId# />
		<cfelse>
			<cfquery  name='getFile' datasource='#Application.DataSrc#'>
			  SELECT  pg_files.*,pPatients.Pt_Last,pPatients.Pt_First 
			  FROM  #Request.prefix_db_agency#.pg_files
			  JOIN  #Request.prefix_db_agency#.pPatients ON pPatients.Patient_ID = pg_files.Patient_Id AND pPatients.status < 2
			  WHERE pg_files.id = #url.file_id#
			  AND   pg_files.Agency_Id = '#session.AgencyId#'
			</cfquery>
			<cfset path = 'Progress_files/agency_'&#session.AgencyId# />
		</cfif>
		<cfset getfilename = "s3://#Request.bucket_accesskey#:#Request.bucket_secretkey#@#Request.bucket_name#/#path#/#getFile.Dup_file_name#" />
		
		<!--- Try to read the file from S3 --->
		<cfset is_password_protected = false>
		<cftry>
			<cfset binaryContent = fileReadBinary(getfilename) />
			<cffile action="write" file="#filename#" output="#binaryContent#" charset="binary">
			<cfset local_file_available = true>
		<cfcatch type="any">
			<!--- If file read fails, try alternative method for password protected files --->
			<cfset is_password_protected = true>
			<cflog file="fax_debug" text="S3 file read failed, trying alternative method: #cfcatch.message#">
			
			<!--- Try to copy the file directly from S3 to local filesystem --->
			<cftry>
				<cffile action="copy" source="#getfilename#" destination="#filename#">
				<cfset local_file_available = true>
				<cflog file="fax_debug" text="Successfully copied password protected file from S3">
			<cfcatch type="any">
				<cfset local_file_available = false>
				<cfset message = "Unable to access file from S3: #cfcatch.message#">
				<cflocation url="index.cfm?page=patient&cat=uploadlist&message=#message#" addtoken="no">
			</cfcatch>
			</cftry>
		</cfcatch>
		</cftry>
		
		<!--- Only attempt cover page merge if we have a local file --->
		<cfif local_file_available>
			<!--- Combine cover page with the file --->
			<cfset final_filename = '/var/www/faxfiles/final_' & #DateTimeFormat(now(),'yyyymmddhhmmss')# & '.pdf' />
			
			<!--- Check if both source files exist before merging --->
			<cfif FileExists(cover_filename) AND FileExists(filename)>
				<cftry>
					<cfpdf action="merge" source="#cover_filename#,#filename#" destination="#final_filename#">
					<cfcatch type="any">
						<!--- Check if the error is due to password protection or PDF merge issues --->
						<cfif cfcatch.message CONTAINS "password" OR cfcatch.message CONTAINS "protected" OR cfcatch.message CONTAINS "encrypted" OR cfcatch.message CONTAINS "MERGE operation" OR cfcatch.message CONTAINS "merge" OR cfcatch.message CONTAINS "PDF">
							<!--- Use the original file without coverpage for password protected PDFs --->
							<cfset final_filename = filename>
							<cfset is_password_protected = true>
							<cflog file="fax_debug" text="PDF merge error detected, skipping coverpage: #cfcatch.message#">
						<cfelse>
							<!--- For other errors, show the error message --->
							<cfset message = "PDF merge failed: #cfcatch.message#">
							<cflocation url="index.cfm?page=patient&cat=uploadlist&message=#message#" addtoken="no">
						</cfif>
					</cfcatch>
				</cftry>
			<cfelse>
				<cfset message = "Source files not found for PDF merge">
				<cflocation url="index.cfm?page=patient&cat=uploadlist&message=#message#" addtoken="no">
			</cfif>
		<cfelse>
			<!--- For password protected files, use the local file without cover page --->
			<cfset final_filename = filename>
		</cfif>
		
		<!--- Clean up individual files --->
		<cfif FileExists(cover_filename)>
			<cffile action="delete" file="#cover_filename#">
		</cfif>
		<!--- Only delete the original filename if we created a local merged file --->
		<cfif local_file_available AND final_filename NEQ filename AND FileExists(filename)>
			<cffile action="delete" file="#filename#">
		</cfif>
		
	
		
		<!--- Set the filename for faxing --->
		<cfset fax_filename = final_filename>
		
		<!--- Send fax without cover page if dealing with password protected PDF --->
		<cfif is_password_protected>
			<cfif (session.agencyid EQ '1150' OR session.agencyid EQ '1163') AND CGI.REMOTE_ADDR NEQ '157.51.26.177'>
				<cfset fax_status =  request.fax.send_fax('#fax_number#','#fax_filename#','') />
			<cfelse>
				<cfset fax_status =  request.fax.send_fax('#fax_number#','#fax_filename#','') />
			</cfif>
		<cfelse>
			<cfif (session.agencyid EQ '1150' OR session.agencyid EQ '1163') AND CGI.REMOTE_ADDR NEQ '157.51.26.177'>
				<cfset fax_status =  request.fax.send_fax('#fax_number#','#fax_filename#','#coverpage#') />
			<cfelse>
				<cfset fax_status =  request.fax.send_fax('#fax_number#','#fax_filename#','#coverpage#') />
			</cfif>
		</cfif>
 		<cfif fax_status EQ 'success'>
    		<cfquery  name='updatefiles' datasource='#Application.DataSrc#'>
				  UPDATE  
				 	<cfif URL.filetype EQ  'pat_files'>	
				 		#Request.prefix_db_agency#.files
				  	<cfelse>	
				  		#Request.prefix_db_agency#.pg_files
				  	</cfif>
				    SET faxsend_to = <cfqueryparam cfsqltype="cf_sql_varchar" value="#fax_number#">,
				    faxsent_time = <cfqueryparam cfsqltype="cf_sql_timestamp" value="#now()#">
				  WHERE id IN (<cfqueryparam cfsqltype="cf_sql_integer" value="#url.file_id#" list="yes">)
			</cfquery>
			<cfset message = "Successfully send Fax to #LOCAL.ToName#" />
			<!--- Clean up the final file if it exists and is a local file --->
			<cfif local_file_available AND FileExists(final_filename)>
				<cffile action="delete" file="#final_filename#">
			</cfif>
		<cfelse>
			<cfset message = "Failure due to FAX send API error" />
		</cfif>
		<cfif url.redirect EQ 'newadmission_pdf_form' AND len(trim(url.pid))>
			<cflocation url="index.cfm?page=patient&cat=newadmission_pdf_form&ID=#url.pid#&admitid=#url.aid#&message=#message#" addtoken="no">
		<cfelse>
       		<cflocation url="index.cfm?page=patient&cat=uploadlist&message=#message#" addtoken="no">
       	</cfif>
</cfif>

