<?php

namespace App\Http\Controllers\Physician;

use Illuminate\Http\Request;
use App\Models\CheifComplainTypes;
use App\Models\Clinics;
use App\Models\Roles;
use App\Models\FormEnteries;
use App\Models\Questions;
use App\Models\QuestionOptions;
use App\Models\QuestionCategories;
use DateTime;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;
use Auth;
use App\User;
use App\Helpers\CommonHelper;
use Illuminate\Support\Facades\Config;
use DB;
use Validator;


class PhysicianController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Contracts\Support\Renderable 
     */
    public function index()
    {   
        return view('physician.crud.form');
    }

     public function change_password()
    {   
        return view('physician.crud.change_password');
    }

      public function profile()
    {   
        return view('physician.crud.profile');
    }

     public function editPhysician(Request $request)
    {
        $user = Auth::user();
        $data['roleData']           = Roles::get();
        $data['clinicsData']        = Clinics::select('title','id')->get();
        $data['selectedRoles']      = array();
        $data['selected_clinic']    = array();
        $data['id']                 = $user->id;
        $data['userData']           = user::find($user->id);
        $data['selected_clinic_data'] = "";
        
        if ($user->id) 
        {
            $data['selectedRoles']      = $data['userData']->roles->pluck('id');
            foreach ($data['selectedRoles'] as $value) 
            {
                 $data['selectedRoleId'] =   $value;
            }
            if (!empty($data['userData']->clinic_id))
            {
                $data['selected_clinic'] = clinics::select('title','id')->where('id', $data['userData']->clinic_id)->get();
                foreach ($data['selected_clinic'] as  $value) 
                {
                  $data['selected_clinic_data'] = $value;
                }
            }
        }
        else 
        {
            $data['selectedRoleId'] =   "";
        }
        if($request->input('btn-submit'))
        {   
            $data['name']                             = $request->input('name');
            $data['email']                            = $request->input('userEmail');
            $data['first_name']                       = $request->input('first_name');
            $data['last_name']                        = $request->input('last_name');
            $data['office_phone']                     = $request->input('office_phone');
            $data['extension']                        = $request->input('extension');
            $data['mobile_no']                        = $request->input('mobile_no');
            // $picture                                  = $request->file('picture');
            // $clinic_id                                = asset(config('constants.CHIEF_COMPLAINTS_IMAGE').$request->file('picture'));
            $clinic_id                                = $request->input('clinic');
            $roleId                                   = $request->input('roles');
            $data['id']                               = $request->input('userId');
            // $data['email']                            = $request->input('email');
            // $data['password']                         = bcrypt($request->get('password'));
            $userRoles                                = array(); 
            if($request->file('picture')) 
            {
                $fileName = $_FILES['picture']['name'];
                $image = $request->file('picture'); 
                $image->move(config('constants.CHIEF_COMPLAINTS_IMAGE'), $image->getClientOriginalName());   
                $userImageUrlPath = asset(config('constants.CHIEF_COMPLAINTS_IMAGE').$fileName);
                $data['picture']  = $userImageUrlPath;
            }  
            else
            {
                $data['picture']  = $request->input('oldPicture');
            }

            $user = User::updateOrCreate(
                ['id' => $data['id']],
                $data
            );
            return redirect(route('physician_edit'))->with('success', 'Your Profile edited Successfully!');

        }
       
        return view('physician.crud.profile',$data);
    }

    // CHEIF COMPLAINS LISTING
     public function chiefComplaintsListing()
    {   
        return view('physician.chief-complaints.listing');
    }

    //  CREATE DATATABLE FOR CHEIF COMPLAINS
    public function chiefComplaintsAjax(Request $request)
    {
        $_getParams             = $_GET;
        $params                 = CommonHelper::_processDataTableRequest($_getParams);
        
        $draw                   = $params['draw'];      
        $offset                 = $params['offset'];
        $searchKeyword          = $params['search_keyword'];
        $sortColumn             = $params['sort_column'];
        $sortOrderDirection     = $params['sort_direction'];
        $recordsPerPage         = $params['records_per_page'];
        $objUsers               =  new CheifComplainTypes();

        $recordsTotal           = $objUsers->count();
        $recordsFiltered        = $recordsTotal;
        if($searchKeyword)
        {           
            $objUsers = $objUsers->where(function($query) use ($searchKeyword) 
            {
                $query->orWhere('name', 'like', '%'.$searchKeyword.'%');
                
            });
        }
        $recordsFiltered = $objUsers->count();
     
        $objUsers         = $objUsers->orderby('sort_order', 'ASC')->get();
        $listData = array(); 
        //dd($objUsers);die;         
        foreach ($objUsers as $row) 
        {           
            $deletePath = route('chief_complains_delete', $row->id);
            $editPath   = route('chief_complains_save', $row->id);

            $tplActions  = <<<EOT
            <a title="Edit" class="la la-pencil" href="$editPath" value="edit"><i class="" aria-hidden="true"></i></a>
            <a title="Delete" class="ti-trash" onclick="return confirm('Are you sure want to delete this record?')" href="$deletePath"><i class="" aria-hidden="true"></i></a>
EOT;
            
            $tempArray  = array();
            $roles      = array();
            // $userRoles  = $row->load('roles');
            // foreach ($userRoles->roles as $key => $value) {
            //    $roles[] = $value->name;
            // }
            $tempArray[]    = $row->name;
            $tempArray[]    = '<img src="'.$row->image_front.'">';
            $tempArray[]    = '<img src="'.$row->image_back.'">';
            $tempArray[]    = $row->sort_order;
            $tempArray[]    = $tplActions;
            $listData[]     = $tempArray;
        }
        $data = array(
            "draw"            => $draw,
            "recordsTotal"    => $recordsTotal,
            "recordsFiltered" => $recordsFiltered,
            "data"            => $listData
        );
        
        return response()->json($data);
    }

    public function saveChiefComplaints(Request $request, $id = false)
    {
         $data = array();        
         $data['heading'] = "Add New Chief Complain";

        if ($id) 
            {
                $data['chiefComplaints'] = CheifComplainTypes::find($id);

                 $data['heading'] = "Edit Chief Complain";
              if ($data['chiefComplaints']->image_front) 
              {
                $data['image_front'] = pathinfo($data['chiefComplaints']->image_front);
              }

               if ($data['chiefComplaints']->image_back) 
              {
                $data['image_back'] = pathinfo($data['chiefComplaints']->image_back);
              }
            }
        else 
            {
              $data['image_front'] = "";
              $data['image_back'] = "";
            }

       if ($request->input('btn-submit')) 
       {
            $data['chiefComplaintsId'] = $request->input('chiefComplaintsId');
            $data['name']       = $request->input('name');
            $data['sort_order'] = $request->input('sort_order');

            if ($request->input('old_front_image') || $request->input('old_back_image')) 
            {
                if($request->file('image_front')) 
                    {
                        $rules = array('image_front' => 'required|image|mimes:jpg,png,jpeg|max:2048');
                        // $messages['fav_icon.required']         =  'fav icon is required';
                        $messages['image_front.mimes']            =  'Invalid type of front image file.';
                        $validator = Validator::make($request->all(), $rules,$messages);
                        if ($validator->fails()) 
                        {   
                            $favIconName = $_FILES['image_front']['name'];
                            return redirect(route('chief_complains_save',$data['chiefComplaintsId']))->withErrors($validator)->withInput();
                        }

                        $fileName = $_FILES['image_front']['name'];
                        $image = $request->file('image_front'); 
                        $image->move(config('constants.USER_IMAGE'), $image->getClientOriginalName());   
                        $userImageUrlPath = asset(config('constants.USER_IMAGE').$fileName);
                        $data['image_front']  = $userImageUrlPath;
                    }
                else
                    {
                        $data['image_front']  = $request->input('old_front_image');
                    }

                if($request->file('image_back')) 
                    {
                        $rules = array('image_back' => 'required|image|mimes:jpg,png,jpeg|max:2048');
                        // $messages['fav_icon.required']         =  'fav icon is required';
                        $messages['image_back.mimes']             =  'Invalid type of back image file.';
                        $validator = Validator::make($request->all(), $rules,$messages);
                        if ($validator->fails()) 
                        {   
                            $logoName = $_FILES['image_back']['name'];
                            return redirect(route('chief_complains_save',$data['chiefComplaintsId']))->withErrors($validator)->withInput();
                        }

                        $fileName = $_FILES['image_back']['name'];
                        $image = $request->file('image_back'); 
                        $image->move(config('constants.USER_IMAGE'), $image->getClientOriginalName());   
                        $userImageUrlPath = asset(config('constants.USER_IMAGE').$fileName);
                        $data['image_back']  = $userImageUrlPath;
                    }
                else
                    {
                        $data['image_back']  = $request->input('old_back_image');
                    } 
            }
            else
            {
                if($request->file('image_back')) 
                    {
                        $fileName = $_FILES['image_back']['name'];
                        $image = $request->file('image_back'); 
                        $image->move(config('constants.USER_IMAGE'), $image->getClientOriginalName());   
                        $userImageUrlPath = asset(config('constants.USER_IMAGE').$fileName);
                        $data['image_back']  = $userImageUrlPath;
                    }
                $rules = array('image_front' => 'required|image|mimes:jpg,png,jpeg|max:2048','image_back' => 'required|image|mimes:jpg,png,jpeg|max:2048');
                // $messages['fav_icon.required']         =  'fav icon is required';
                $messages['image_front.mimes']            =  'Invalid type of front image file.';
                // $messages['fav_icon.required']         =  'fav icon is required';
                $messages['image_back.mimes']             =  'Invalid type of back image file.';
                $validator = Validator::make($request->all(), $rules,$messages);
                if ($validator->fails()) 
                {   
                    $favIconName = $_FILES['image_front']['name'];
                    $logoName = $_FILES['image_back']['name'];
                    return redirect(route('chief_complains_save',$data['chiefComplaintsId']))->withErrors($validator)->withInput();
                }
            }

            CheifComplainTypes::updateOrCreate(
                ['id' => $data['chiefComplaintsId']],
                $data
            );
            if ($data['chiefComplaintsId']) 
            {
                $message = 'Chief Complaint edited Successfully! ';
            }
            else 
            {
                $message = 'Chief Complaint added Successfully! ';
            }
            return redirect(route('chief_complains_listing'))->with('success', $message);

       }
      
        return view('physician.chief-complaints.form', $data);

    }

     public function deleteChiefComplains($id)
    {
        if($id)
        {   
            $CheifComplainData   = CheifComplainTypes::find($id);
            if(!$CheifComplainData)
            {
                // Redirect to base
                return redirect(route('admin_users_listing'));
            }
            $CheifComplainData->where('id', $id)->delete();
            return redirect()->back()->with('success', 'Cheif Complain has been deleted successfully!');
            return redirect(route('admin_users_listing'));
        }
    }

    //ADD AND EDIT PHYSICIAN 

    public function questionOptionsList(Request $request)
    {   
        $optionData  = array();
        if ($request->input('question_id')) 
        {
            $optionData   = QuestionOptions::where('question_id',$request->input('question_id'))->orderby('sort_order')->get()->toArray();
        }
        echo json_encode(['data'=>$optionData]);die;
    }

     public function complainTypeList(Request $request)
    {   
        $optionData  = array();
        if ($request->input('complain_type_id')) 
        {
            $optionData   = Questions::where('complain_type_id',$request->input('complain_type_id'))->orderby('sort_order')->get()->toArray();
        }

        echo json_encode(['data'=>$optionData]);die;
    }

    public function saveQuestions(Request $request , $id = 0)
    {
      // $data = new Questions();
        $heading = "Add New Question";
        $questions          = new Questions();
        $questionData       = Questions::All();
        $questionsArray= "";
        $route = route('save_question');
        if ($id) 
        {   
            $heading = "Edit Question";
            $questions = Questions::find($id);
            $questionsArray= array();
            $questionsArray = Questions::where('complain_type_id',$questions->complain_type_id)->get()->toArray();
            if(empty($questions))
            {
                return redirect(route('questions_listing'));
            }
            $route = route('save_question',$id);
        }
        if ($request->input('btn-submit')) 
        {   
            // dd($request->input('old_questions_opt_id'));
            //dd($request);
            // validation here

            $questions->name                = $request->input('name');
            $questions->category_id         = $request->input('category');
            $questions->sort_order          = $request->input('sort_order');
            $questions->status              = $request->input('status');
            if($request->input('parent_question_id'))
            {
                $questions->parent_question_id  = $request->input('parent_question_id');
            }

            $questions->department_id       = Auth::user()->department_id;
            $questions->added_by_id         = Auth::user()->id;
            $questions->complain_type_id    = $request->input('complain_type');
            $questions->question_option_id  = $request->input('question_option_id');

            if($request->input('name') && $request->input('complain_type_id'))
            {   
                $questions->complain_type_id    = $request->input('complain_type_id');

            }
            $questions->save();

            $questionOptionsId              = $request->input('old_questions_opt_id');
            $questionOptionsText            = $request->input('option_text');
            $questionOptionsOrder           = $request->input('option_order');
            $questionOptionsNarrativeText   = $request->input('option_narrative_text');

            if($questionOptionsText)
            {   
                if(!empty($questionOptionsId))
                {
                    QuestionOptions::whereNotIn('id',$questionOptionsId)->where('question_id',$questions->id)->delete();
                }
                // dd($request);
                foreach ($questionOptionsText as $key => $value)
                {   
                    $questionOptionsData = array();
                    $id = @$questionOptionsId[$key];
                   
                   /* if($id)
                    {
                        $questionOptionsData                  = QuestionOptions::find($id);
                    }
                    else
                    {
                         $questionOptionsData                      = new QuestionOptions();
                    }*/
                    //$questionOptionsData['id']              = $questionOptionsId[$key];
                    $questionOptionsData['title']             = $value;
                    $questionOptionsData['sort_order']        = $questionOptionsOrder[$key];
                    $questionOptionsData['narrative_text']    = $questionOptionsNarrativeText[$key];
                    $questionOptionsData['question_id']       = $questions->id;
                    QuestionOptions::updateOrCreate(['id' => $id]
                        ,$questionOptionsData);
                    //$questionOptionsData->save();
                    
                   
                }
            }
            return redirect(route('questions_listing'))->with('success', 'Question has been saved successfully!');

        }
        return view('physician.questions.form',[
            'questionData'=>$questionData,
            'heading'=>$heading,
            'route'=>$route,
            'questions'=>$questions,
            'questionsArray'=>$questionsArray,
            'questionOptions'=>QuestionOptions::where('question_id',$id)->orderby('sort_order')->get(),
            'complain_types'=>CheifComplainTypes::all(),
            'categories'=> QuestionCategories::all(),
            'id'=>$id,
            ]
        );

    }

      //  CREATE DATATABLE FOR CHEIF COMPLAINS
    public function QuestionsAjax(Request $request)
    {
        $_getParams             = $_GET;
        $params                 = CommonHelper::_processDataTableRequest($_getParams);
        
        $draw                   = $params['draw'];      
        $offset                 = $params['offset'];
        $searchKeyword          = $params['search_keyword'];
        $sortColumn             = $params['sort_column'];
        $sortOrderDirection     = $params['sort_direction'];
        $recordsPerPage         = $params['records_per_page'];
        $objQuestions           =  new Questions();

        $recordsTotal           = $objQuestions->count();
        $recordsFiltered        = $recordsTotal;
        if($searchKeyword)
        {           
            $objQuestions = $objQuestions->where(function($query) use ($searchKeyword) 
            {
              $query->orWhere('name', 'like', '%'.$searchKeyword.'%');

            });
        }
        $recordsFiltered        = $objQuestions->count();
     
        $objQuestions               = $objQuestions->orderby('sort_order', 'ASC')->get();
        $listData = array(); 
                 
        foreach ($objQuestions as $key => $row) 
        {       
            $tempArray      = array();
            $_arOptionData  = array();
            $tempArray[]    = $row->name;
            $tempArray[]    = $row->sort_order;

            $questionOptions = QuestionOptions::where('question_id', $row->id)->orderby('sort_order')->get();
          
            foreach ($questionOptions as  $value) 
            {

                $_arOptionData[]    = "<li>".$value->title."</li>";
               
            }
                $tempArray[]    = implode('', $_arOptionData);
                // $tempArray[]    = $tempArray2;

           
            $deletePath = route('delete_questions', $row->id);
            $editPath   = route('save_question', $row->id);
            $statusIcon = "ti-close";
            $statusText = "Inactive Now";
            $status = 'Active';
            if($row->status==config('constants.CONSTANT_STATUS_INACTIVE'))
            {   
                $statusIcon = "ti-check";
                $status = 'Inactive';
                $statusText = "Active Now";
            }
            $tplActions  = <<<EOT
            <a title="Edit" class="la la-pencil" href="$editPath" value="edit" style="margin:5px;><i class="" aria-hidden="true"></i></a>
            <small><a title="$statusText" class="$statusIcon" onclick="return confirm('Are you sure want to change the status of this record?')" href="$deletePath" style="margin:5px;><i class="" aria-hidden="true"></i></a></small>
EOT;
            
            $roles      = array();
           
            $tempArray[]    = $status;
            $tempArray[]    = $tplActions;
            $listData[]     = $tempArray;
        }
        $data = array(
            "draw"            => $draw,
            "recordsTotal"    => $recordsTotal,
            "recordsFiltered" => $recordsFiltered,
            "data"            => $listData
        );
        
        return response()->json($data);
    }

    // QUESTIONS LISTING

      public function questionsListing()
    {   
        return view('physician.questions.listing');
    }

    // DELETE QUESTIONS

      public function deleteQuestions($id)
    {
        if($id)
        {   
            $questionData   = Questions::find($id);
            if(!$questionData)
            {
                // Redirect to base
                return redirect(route('questions_listing'));
            }
            if(config('constants.CONSTANT_STATUS_INACTIVE')==$questionData->status)
            {
                $questionData->status = config('constants.CONSTANT_STATUS_ACTIVE');
            }
            else
            {
                $questionData->status = config('constants.CONSTANT_STATUS_INACTIVE');
            }
            $questionData->save();
            //QuestionOptions::where('question_id',$id)->update(['status' => 0]);
            return redirect()->back()->with('success', 'Question has been deleted successfully!');
            //return redirect(route('questions_listing'));
        }
    }

    public function chiefComplainsTree()
    {
        return view('physician.tree-view.complain_tree');
    }
}
