<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Categories;
use App\Models\CategoryDetails;
use App\Models\Languages;
use App\Models\Videos;
use Image;
use File;

/**
 * Class CategoryController.
 */
class CategoryController extends Controller
{
	/**
     * @var model
     * @var videosModel
     * @var languagesModel
     * @var categoryDetailsModel
     */
    protected $model;
    protected $videosModel;
    protected $languagesModel;
    protected $categoryDetailsModel;

    /**
     * CategoryController constructor.
     *
     * @param model $model
     * @param videosModel $videosModel
     * @param languagesModel $languagesModel
     * @param categoryDetailsModel $categoryDetailsModel
     */

    public function __construct()
    {
        $this->model = new Categories;
        $this->videosModel = new Videos;
        $this->languagesModel = new Languages;
        $this->categoryDetailsModel = new CategoryDetails;
    }

    /**
     * Category list method.
     *
     */

    public function index() 
    {
        $categories = $this->model->get();
       	return view('admin.pages.categories.list')
                ->withCategories($categories);
    }

    /**
     * Category status update method.
     *
     * @param $req
     *
     * @return redirection
     */

    public function status(Request $req){
    	$category_id = base64_decode($req->id);
    	$categorydetails = $this->model->find($category_id);
    	if($categorydetails){
    		$new_status = ($categorydetails->status == 0) ? 1 : 0;
    		$this->model->find($category_id)->update(['status'=>$new_status]);
    		session()->flash('success', 'category Status Changed Successfully');
            return redirect()->route('admin.category');
    	} else {
    		session()->flash('error', 'category Not Found');
            return redirect()->route('admin.category');
    	}
    }

    /**
     * Category delete method.
     *
     * @param $req
     *
     * @return redirection
     */
    public function delete(Request $req){
    	$category_id = base64_decode($req->id);
    	$categorydetails = $this->model->find($category_id);

        $video_having_this_category = $this->videosModel->where('category_id', $category_id)->first();
    	if($categorydetails){
            if($video_having_this_category){
                session()->flash('error', 'This category related to a video, so could not be deleted');
            } else {
                $this->categoryDetailsModel->where('category_id', $category_id)->delete();
                $this->model->find($category_id)->delete();
                session()->flash('success', 'Category Deleted Successfully');
            }
            return redirect()->route('admin.category');
    	} else {
    		session()->flash('error', 'Category Not Found');
            return redirect()->route('admin.category');
    	}
    }

    /**
     * Category add method.
     *
     * @return redirection
     */
    public function add(){
        $languages = $this->languagesModel->get();
        return view('admin.pages.categories.add')
                    ->withLanguages($languages);
    }

    /**
     * Category details save method.
     *
     * @param $req
     *
     * @return redirection
     */
    public function save(Request $req){
        /**
        *post operation
        **/
        if($req->post()){
            $languages = $this->languagesModel->get();
            $messages = [];
            foreach ($languages as $key => $language) {
                $messages['name.'.$key.'.required'] = 'Please Fill '.$language->name.' Name Field';
                $messages['name.'.$key.'.unique'] = 'The '.$language->name.' name has already been taken';
            }
            $req->validate([
                'name.*' => 'required|max:255|unique:category_details,name',
                'category_pic' => 'mimes:jpeg,jpg,png,gif|max:10000'
            ], $messages);
            //dd($messages);
            /**
            *Image upload operation
            **/
            $filename = '';
            if($req->file('category_pic')){
                if($req->file('category_pic')->isValid()){                    
                    $file = $req->file('category_pic');
                    $filename = time().str_random(5).'.'.$file->getClientOriginalExtension();
                    $path = 'category';
                    $destination = public_path('storage/category');
                    $upload_location = $path.'/'.$filename;
                    $img = Image::make($file->getRealPath());
                    $img->resize(260, 260, function ($constraint) {
                        $constraint->aspectRatio();
                    })->save($destination.'/'.$filename);
                }
            }
            
            $insert_arr = [
                'name' => $req->name[0],
                'status' => 1
            ];
            if($filename){
                $insert_arr['image'] = $filename;
            }
            $insert = $this->model->create($insert_arr);

            foreach ($languages as $key => $language) {
                $insert__details_arr = [
                    'name' => $req->name[$key],
                    'category_id' => $insert->id,
                    'language_id' => $language->id
                ];
                $this->categoryDetailsModel->create($insert__details_arr);
            }
            session()->flash('success', 'Category Details Added Successfully');
            return redirect()->route('admin.category');
        }
    }

    /**
     * Category edit method.
     *
     * @param $req
     *
     * @return redirection
     */
    public function edit(Request $req){
    	$category_id = base64_decode($req->id);
        $languages = $this->languagesModel->get();
    	$categorydetails = $this->model->find($category_id);
        $categorydetailsValues = $this->categoryDetailsModel->where('category_id', $category_id)->get();
        if($categorydetails){
    		return view('admin.pages.categories.edit')
                ->withCategorydetails($categorydetails)
                ->withLanguages($languages)
                ->withCategorydetailsValues($categorydetailsValues);
    	} else {
    		session()->flash('error', 'category Not Found');
            return redirect()->route('admin.category');
    	}
    }

    /**
     * Category details update method.
     *
     * @param $req
     *
     * @return redirection
     */
    public function update(Request $req){
    	$category_id = base64_decode($req->id);
    	$categorydetails = $this->model->find($category_id);
    	if($categorydetails){
        	/**
        	*post operation
        	**/
        	if($req->post()){
        		$languages = $this->languagesModel->get();
                $messages = [];
                foreach ($languages as $key => $language) {
                    $messages['name.'.$key.'.required'] = 'Please Fill '.$language->name.' Name Field';
                    $messages['name.'.$key.'.unique'] = 'The '.$language->name.' name has already been taken';
                }
                $req->validate([
                    'name.*' => 'required|max:255|unique:category_details,name,'.$category_id.',category_id',
                    'category_pic' => 'mimes:jpeg,jpg,png,gif|max:10000'
                ], $messages);
        		/**
    	    	*Image upload operation
    	    	**/
    			$filename = '';
                if($req->file('category_pic')){
                	if($req->file('category_pic')->isValid()){
                		if (File::exists(public_path('storage/category/'.$categorydetails->image))) {
    				        unlink(public_path('storage/category/'.$categorydetails->image));//unlik uploaded file
    				    }
    	            	$file = $req->file('category_pic');
    					$filename = time().str_random(5).'.'.$file->getClientOriginalExtension();
    	                $path = 'category';
    	                $destination = public_path('storage/category');
    	                $upload_location = $path.'/'.$filename;
    	                $img = Image::make($file->getRealPath());
    	                $img->resize(260, 260, function ($constraint) {
    	                    $constraint->aspectRatio();
    	                })->save($destination.'/'.$filename);
                	}
                }

                $update_arr = [
                	'name' => $req->name[0],
                ];
                if($filename){
                    $update_arr['image'] = $filename;
                }
                $this->model->find($category_id)->update($update_arr);

                foreach ($languages as $key => $language) {
                    $categoryDetailsData = $this->categoryDetailsModel
                        ->where([
                                'category_id' => $category_id,
                                'language_id' => $language->id
                        ])->first();
                    if(!$categoryDetailsData){
                        $insert__details_arr = [
                            'name' => $req->name[$key],
                            'category_id' => $category_id,
                            'language_id' => $language->id
                        ];
                        $this->categoryDetailsModel->create($insert__details_arr);
                    } else {
                        $update_details_arr = [
                            'name' => $req->name[$key],
                        ];
                        $this->categoryDetailsModel
                            ->where([
                                    'category_id' => $category_id,
                                    'language_id' => $language->id
                            ])
                        ->update($update_details_arr);
                    }
                }

                session()->flash('success', 'Category Details Updated Successfully');
                return redirect()->route('admin.category');
        	}
    	} else {
    		session()->flash('error', 'Category Not Found');
            return redirect()->route('admin.category');
    	}
    }
}
