<cfsetting showdebugoutput="false">
<cfheader name="Content-Type" value="application/json; charset=utf-8">

<cfset responseStruct = { "success": false, "message": "", "data": {} }>
<cfset statusCode = 200>

<cftry>
    <cfif cgi.REQUEST_METHOD NEQ "POST">
        <cfset statusCode = 405>
        <cfset responseStruct.message = "Method not allowed. Use POST.">
        <cfthrow type="whisper.invalidMethod" message="Only POST requests are supported.">
    </cfif>

    <cfset agencyId = structKeyExists(session, "AgencyID") ? session.AgencyID : (structKeyExists(session, "AgencyId") ? session.AgencyId : "")>
    <cfif NOT len(trim(agencyId))>
        <cfset statusCode = 401>
        <cfset responseStruct.message = "Session expired. Please sign in again.">
        <cfthrow type="whisper.sessionMissing" message="AgencyID not found in session.">
    </cfif>

    <cfparam name="form.whisper_file_id" default="">
    <cfset whisperFileId = val(form.whisper_file_id)>
    <cfif whisperFileId LTE 0>
        <cfset statusCode = 400>
        <cfset responseStruct.message = "A valid whisper file ID is required.">
        <cfthrow type="whisper.invalidInput" message="Missing whisper_file_id.">
    </cfif>

    <cfset patientIdFromSession = (structKeyExists(session, "cs") AND structKeyExists(session.cs, "patientid")) ? val(session.cs.patientid) : 0>
    <cfset employeeId = structKeyExists(session, "EmployeeId") ? session.EmployeeId : (structKeyExists(session, "EmployeeID") ? session.EmployeeID : 0)>

    <cfquery name="getWhisperFile" datasource="#Application.DataSrc#">
        SELECT ID, Patient_Id, Assmt_ID, Notes, Review_Status, Upload_Source
        FROM #Request.prefix_db_agency#.whisper_files
        WHERE ID = <cfqueryparam value="#whisperFileId#" cfsqltype="cf_sql_bigint">
          AND Agency_Id = <cfqueryparam value="#agencyId#" cfsqltype="cf_sql_varchar">
          AND Status = 0
        <cfif patientIdFromSession GT 0>
          AND Patient_Id = <cfqueryparam value="#patientIdFromSession#" cfsqltype="cf_sql_varchar">
        </cfif>
        LIMIT 1
    </cfquery>

    <cfif getWhisperFile.recordcount EQ 0>
        <cfset statusCode = 404>
        <cfset responseStruct.message = "Whisper file not found or unavailable.">
        <cfthrow type="whisper.fileNotFound" message="No whisper_files row for ID #whisperFileId#.">
    </cfif>

    <cfif val(getWhisperFile.Review_Status) NEQ 1>
        <cfset statusCode = 400>
        <cfset responseStruct.message = "This file is not awaiting clinician review.">
        <cfthrow type="whisper.invalidState" message="Review_Status is not 1 for whisper file #whisperFileId#.">
    </cfif>

    <cfset reviewTimestamp = dateTimeFormat(now(), "mm/dd/yyyy hh:nn:ss tt")>
    <cfset reviewNote = "[Clinician review completed - #reviewTimestamp#] Emp #employeeId#">
    <cfset existingNotes = trim(getWhisperFile.Notes)>
    <cfset updatedNotes = len(existingNotes) ? (existingNotes & " | " & reviewNote) : reviewNote>

    <cfquery name="markReviewed" datasource="#Application.DataSrc#">
        UPDATE #Request.prefix_db_agency#.whisper_files
        SET Review_Status = <cfqueryparam value="2" cfsqltype="cf_sql_tinyint">,
            Notes = <cfqueryparam value="#updatedNotes#" cfsqltype="cf_sql_longvarchar">
        WHERE ID = <cfqueryparam value="#whisperFileId#" cfsqltype="cf_sql_bigint">
          AND Agency_Id = <cfqueryparam value="#agencyId#" cfsqltype="cf_sql_varchar">
          AND Status = 0
          AND Review_Status = <cfqueryparam value="1" cfsqltype="cf_sql_tinyint">
    </cfquery>

    <cfset responseStruct.success = true>
    <cfset responseStruct.message = "Assessment review marked complete.">
    <cfset responseStruct.data = {
        "whisper_file_id": whisperFileId,
        "assmt_id": trim(getWhisperFile.Assmt_ID),
        "review_status": 2
    }>

    <cfheader statuscode="#statusCode#" statustext="OK">
    <cfoutput>#serializeJSON(responseStruct)#</cfoutput>

<cfcatch type="any">
    <cfif statusCode EQ 200>
        <cfset statusCode = 500>
    </cfif>
    <cfif NOT len(trim(responseStruct.message))>
        <cfset responseStruct.message = "Unable to mark whisper file as reviewed.">
    </cfif>
    <cfset responseStruct.errorDetail = cfcatch.message>
    <cfheader statuscode="#statusCode#" statustext="Error">
    <cfoutput>#serializeJSON(responseStruct)#</cfoutput>
</cfcatch>
</cftry>
