<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use App\HttpModels\ClientLobbyModel;
use App\HttpModels\MeetingModel;
use App\Models\AppSession;
use Cookie;

use App\Models\Note;
use App\Models\Client;
use App\Models\Section;
use App\Models\SectionTemplate;

class NoteController extends Controller
{

    public function renderNote($noteUid, Request $request)
    {

        $note = Note::where('uid', $noteUid)->first();
        $client = Client::where('id', $note->client_id)->first();

        return view('client/note', compact('note', 'client'));
    }

    public function selectSectionTemplateForm($note_uid, Request $request)
    {
        $sectionTemplates = SectionTemplate::all();
        $note = Note::where('uid', $note_uid)->first();
        return view('client/select_section_template_form', compact('note', 'sectionTemplates'));
    }

    public function sectionCreateForm($note_uid, $section_template_uid, Request $request)
    {
        $note = Note::where('uid', $note_uid)->first();
        $sectionTemplate = SectionTemplate::where('uid', $section_template_uid)->first();
        $section = null; // convenience
        include(storage_path('sections/' . $sectionTemplate->internal_name . '/form.blade.php'));
    }

    public function sectionUpdateForm($section_uid, Request $request)
    {
        $section = Section::where('uid', $section_uid)->first();
        $note = Note::where('id', $section->note_id)->first();
        $sectionTemplate = SectionTemplate::where('id', $section->section_template_id)->first();
        include(storage_path('sections/' . $sectionTemplate->internal_name . '/form.blade.php'));
    }

    public function processFormSubmit(Request $request)
    {
        // for CREATE
        $note_uid =  $request->note_uid;
        $section_template_uid =  $request->section_template_uid;
        
        // for UPDATE
        $section_uid =  $request->section_uid;

        $section = $section_uid ? Section::where('uid', $section_uid)->first() : null;
        $note = null;
        $sectionTemplate = null;
        
        if($section == null){
            $note = Note::where('uid', $note_uid)->first();
            $sectionTemplate = SectionTemplate::where('uid', $section_template_uid)->first();
        } else {
            $note = Note::where('id', $section->note_id)->first();
            $sectionTemplate = SectionTemplate::where('id', $section->section_template_id)->first();
        }

        $newContentData = [];
        
        // we wish to pass THESE arguments into this include: 
        // if CREATE, $note and $sectionTemplate, and $request
        // if UPDATE, $section, and $request
        include(storage_path('sections/' . $sectionTemplate->internal_name . '/processor.php'));

        // now, create summaryHtml appropriate
        ob_start();
        include(storage_path('sections/' . $sectionTemplate->internal_name . '/summary.php'));
        $newSummaryHtml = ob_get_contents();
        ob_end_clean();

        if($section){
            // call Java to update section
            $data = [
                'uid' => $section->uid,
                'contentData' => json_encode($newContentData),
                'summaryHtml' => $newSummaryHtml
            ];
            $response = $this->calljava($request, '/api/section/update', $data);
            //TODO: handle if response->success == false
        }else{
            // call Java to create section
            $data = [
                'noteUid' => $note->uid,
                'sectionTemplateUid' => $sectionTemplate->uid,
                'contentData' => json_encode($newContentData),
                'summaryHtml' => $newSummaryHtml
            ];
            $response = $this->callJava($request, '/api/section/create', $data);
            //TODO: handle if response->success == false
        }
        return redirect(route('render-note',$note->uid));
    }

    private function callJava($request, $endPoint, $data){
        $url = env('BACKEND_URL', 'http://localhost:8080') . $endPoint;
        $response = Http::asForm()
        ->withHeaders(['sessionKey'=>$request->cookie('sessionKey')])
        ->post($url, $data)
        ->json();
        return $response;
    }
}
