middleware('auth'); $this->_service = 'mag'; $this->_module = 'magazine'; $this->_viewname = 'session'; $this->_title = 'Session'; $this->_base_url = '/session'; $this->_basemodel = new Session; } protected function get_list_data(Request $request) { $sessions = !empty(Auth::user()->sessions) ? json_decode(Auth::user()->sessions) : []; // $roles = json_decode(Auth::user()->roles); // foreach($roles as $role) { // $role = LambdaRequest::signedrequest('get', 'ums', 'roles/get_one', ['id' => $role]); // //echo '
'; print_r($role); exit;
        // }
        if(Auth::user()->id > 2) {
            $data = $this->_basemodel->wherein('code', $sessions)->orderby('id', 'desc')->get();
        } else {
            $data = $this->_basemodel->orderby('id', 'desc')->get();
        }
        //echo '
'; print_r($data); exit;
        $modeLabels = Session::communicationModes();
        $dd = [];
        foreach($data->toArray() as $d) {
            $mode = $d['communication_mode'] ?? Session::MODE_WHATSAPP;
            $d['communication_mode'] = $modeLabels[$mode] ?? 'WhatsApp';
            $dd[] = (object)$d;
        }
        return $dd;
    }

    protected function get_list_buttons() {
        return [ ['title' => 'Add New', 'link' => $this->_base_url.'/addnew' ] ];
    }

    protected function get_list_fields(){
        return [
            'actions' => ['title' => 'Actions', 'buttons' => [ 'edit', 'delete', 'agenda' => ['icon' => 'format-list-text', 'querystring' => 'id={ID}'], 'visit' => ['icon' => 'eye', 'querystring' => 'id={ID}', 'target' => '_blank'], 'brochure' => ['icon' => 'page-layout-body', 'querystring' => 'id={ID}', 'target' => '_blank'], 'attendance' => ['icon' => 'account', 'querystring' => 'id={ID}', 'target' => '_blank'] ] ],
            'type' => ['title' => 'Session Type', 'type' => 'text'],
            'number' => ['title' => 'Session Title', 'type' => 'text'],
            'start_date' => ['title' => 'Date', 'type' => 'date'], 
            'venue' => ['title' => 'Venue', 'type' => 'text'], 
            'status' => ['title' => 'Status', 'type' => 'select'],
            'communication_mode' => ['title' => 'Communication Mode', 'type' => 'text'],
        ];
    }

    protected function get_form_fields($type, $values){
    	$faculties = DB::table('faculty')->where('status', 'active')->select('id', 'name', 'type')->get();
    	$faculty_bb = [];
        $faculty_types = [];
    	foreach($faculties as $faculty){
            $types = explode(',', $faculty->type);
            foreach($types as $type) {
                $faculty_types[$type][] = $faculty->id;
            }
            $faculty_bb[$faculty->id] = $faculty->name;
        }
        //echo '
'; print_r($faculty_types); exit;
        $fields = [
            'type' => ['title' => 'Session Type', 'type' => 'select', 'values' => ['road' => 'Road', 'casper' => 'Casper', 'casper_clinic' => 'Casper Clinic', 'APFT' => 'APFT', 'spirometry_simplified' => 'Spirometry Simplified', 'casper_clinic_new' => 'Casper Clinic New', 'casper_plus' => 'Casper Plus', 'ecampus' => 'E Campus'], 'required' => true],
            'number' => ['title' => 'Title', 'type' => 'text', 'required' => true ],
            'venue' => ['title' => 'Venue', 'type' => 'text', 'required' => true, 'fullwidth' => true], 
            'address' => ['title' => 'Address', 'type' => 'textarea', 'fullwidth' => true], 
            'faculty' => ['title' => 'Faculty (multiple)', 'type' => 'multiselect', 'required' => true, 'values' => $faculty_bb, 'types' => $faculty_types ],
            'status' => ['title' => 'Status', 'type' => 'select', 'required' => true, 'values' => ['active' => 'Active', 'disabled' => 'Disabled'] ],
            'join_link' => ['title' => 'Join Link', 'type' => 'text', 'fullwidth' => true], 
            'feedback_link' => ['title' => 'Feedback Link', 'type' => 'text', 'fullwidth' => true], 
            'survey_link' => ['title' => 'Survey Link', 'type' => 'text', 'fullwidth' => true],
            'communication_mode' => [
                'title' => 'Communication Mode',
                'type' => 'select',
                'values' => Session::communicationModes(),
            ],
        ];
        return $fields;
    }

    protected function _beforesave($type, $request) {
        $data = $request->except('_token');
        if ($type == 'new') {
        	$data['code'] = \Str::random(20);
        }
        //echo '
'; print_r($data); exit;
        $data['start_date'] = $data['dates']['date'][0];
        $data['dates'] = json_encode($data['dates']);
        $data['faculty'] = '|'.implode('|',$data['faculty']).'|';
        $comm = app(SessionCommunicationService::class);
        $data['communication_mode'] = $comm->normalizeModeForSave($data['communication_mode'] ?? null);
        return $data;
    }

    protected function _beforeform($type, $values) {
        //$values->library_ids = explode(',', $values->library_ids);
        if($type == 'edit') {
            $values->dates = json_decode($values->dates);
            $values->faculty = explode('|', $values->faculty);
            $values->faculty = array_filter($values->faculty, function($value) { return !is_null($value) && $value !== ''; });
            if (empty($values->communication_mode)) {
                $values->communication_mode = Session::MODE_WHATSAPP;
            }
        }
        //echo '
'; print_r($values); exit;
        return $values;
    }

    public function visit(Request $request) {
        $id = $request->input('id');
        $values = $this->_basemodel->find($id)->toArray();
        return redirect('/microsite/'.$values['type'].'-'.$values['code']);
    }

    public function attendance(Request $request) {
        $id = $request->input('id');
        $session = $this->_basemodel->find($id);
        $response = LambdaRequest::getrequest('contact', 'contact/get_all', ['source'=>'dynamodb', 'search' => json_encode(['session_code' => $session->code]), 'fields' => json_encode(['session_code', 'present', 'date_of_birth', 'gender', 'alternate_phone', 'city', 'state', 'highlight_qualification', 'specialization', 'type_of_setup', 'designation', 'clinic_institute_name', 'feedback']) ], env('LAMBDA_ACCESS_TOKEN', 'default_value') );
        $docs = [];
        //echo '
'; print_r($response); print_r($session); exit;
        foreach($response->data->items as $doc) {
            $doc->type_of_setup = is_array($doc->type_of_setup) ? implode(', ', $doc->type_of_setup) : $doc->type_of_setup;
            $docs[] = $doc;
        }
        //
        return view('session.attendance', ['session' => $session, 'doctors' => $docs]);
    }

    public function certificate(Request $request) {
        $code = $request->input('code');
        $session = $this->_basemodel->where('code', $code)->first();
        $doctor = $request->input('doctor');
        $response = LambdaRequest::getrequest('contact', 'contact/get_one', ['id'=>$doctor], env('LAMBDA_ACCESS_TOKEN', 'default_value') );
        $doctor = $response->data->item;
        //echo '
'; print_r($doctor); exit;
        $output = Creation::certificate($session, $doctor);
        $filename = $output['filename'];
        $folder = $output['folder'];

        $headers = array('Content-Type: image/png',);
        return Response::download($folder.'/'.$filename, 'certificate.png',$headers);
    }

    public function certificatepreview(Request $request) {
        $type = $request->input('type', 'casper_plus');
        $session = (object) [
            'type' => $type,
            'code' => 'preview',
            'start_date' => $request->input('date', date('Y-m-d')),
        ];
        $doctor = (object) [
            'name' => $request->input('name', 'Sample Doctor Name'),
            'id' => 'preview-' . time(),
        ];
        $output = Creation::certificate($session, $doctor);

        return response()->file($output['folder'] . '/' . $output['filename'], [
            'Content-Type' => 'image/png',
        ]);
    }

    public function agenda(Request $request) {
        $id = $request->input('id', 0);
        if($id === 0) {
            return redirect('/sessions')->withError('Session not found!');
        } else {
            $request->session()->put('session_id', $id);
            return redirect('/sessionagendas');
        }
    }

    public function brochure(Request $request) {
        $id = $request->input('id', 0);
        if($id === 0) {
            return redirect('/sessions')->withError('Session not found!');
        } else {
            $session = $this->_basemodel->find($id);
            return redirect('/brochure/'.$session->code.'?fresh=1');
        }
    }

    protected function retimage($image) {
        $size = getimagesize($image);
        switch ($size['mime']) {
            case 'image/jpeg':
                $photoimg = imagecreatefromjpeg($image);
                break;
            case 'image/png':
                $photoimg = imagecreatefrompng($image);
                break;
            case 'image/jpeg':
                $photoimg = imagecreatefrompng($image);
                break;
            default:
                # code...
                break;
        }
        return $photoimg;
    }
    
    public function sendnotification(Request $request)
    {
        $session_id = $request->input('session_id');
        if (!$session_id) {
            return response()->json(['status' => 'error', 'message' => 'Session ID is required.'], 400);
        }

        $session = Session::find($session_id);
        if (!$session) {
            return response()->json(['status' => 'error', 'message' => 'Session not found.'], 404);
        }

        $comm = app(SessionCommunicationService::class);
        $mode = $comm->resolveMode($session);

        $response = null;
        if ($comm->shouldSendWhatsApp($mode)) {
            $response = LambdaRequest::signedrequest(
                'get',
                'mag',
                'sessions/sendnotification',
                [
                    'session_id' => $session_id,
                    'communication_mode' => $mode,
                ]
            );
        }

        $emailQueued = 0;
        if ($comm->shouldSendEmail($mode)) {
            $emailQueued = $this->sendnotificationEmail($session);
        }

        $waOk = !$comm->shouldSendWhatsApp($mode)
            || (isset($response->status) && $response->status == 'success');

        if ($waOk || $emailQueued > 0) {
            return response()->json(['status' => 'success', 'message' => 'Notification sent successfully.']);
        }

        $errorMsg = isset($response->message) ? $response->message : 'Failed to send notification.';
        return response()->json(['status' => 'error', 'message' => $errorMsg], 500);
    }

    protected function sendnotificationEmail(Session $session): int
    {
        $comm = app(SessionCommunicationService::class);
        $response = LambdaRequest::getrequest(
            'contact',
            'contact/get_all',
            [
                'source' => 'dynamodb',
                'search' => json_encode(['session_code' => $session->code]),
                'fields' => json_encode(['session_code', 'email', 'name', 'phone', 'id']),
            ],
            env('LAMBDA_ACCESS_TOKEN', 'default_value')
        );

        if (empty($response->data->items)) {
            return 0;
        }

        $message = $this->buildSessionNotificationText($session);
        $queued = 0;

        foreach ($response->data->items as $contact) {
            if ($comm->queueEmailFromText($session, $contact, $message, 'session_notification')) {
                $queued++;
            }
        }

        return $queued;
    }

    protected function buildSessionNotificationText(Session $session): string
    {
        $lines = [
            'Greetings,',
            '',
            'This is a notification regarding your Crest session "' . $session->number . ' (' . $session->type . ')".',
            '',
            'Venue: ' . $session->venue,
            'Address: ' . ($session->address ?? ''),
            '',
            'Timings:',
        ];

        $dates = json_decode($session->dates);
        if ($dates && isset($dates->date)) {
            foreach ($dates->date as $i => $date) {
                $lines[] = date('d M, Y', strtotime($date))
                    . ' at ' . date('h:iA', strtotime($dates->start[$i]))
                    . ' - ' . date('h:iA', strtotime($dates->end[$i]));
            }
        }

        $lines[] = '';
        $lines[] = 'Session website: https://road.xltr.in/microsite/' . $session->type . '-' . $session->code;
        $lines[] = '';
        $lines[] = 'Regards,';
        $lines[] = 'CREST Team';

        return implode("\n", $lines);
    }
}