<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Videos;
use App\Models\VideoDetails;
use App\Models\Languages;
use App\Models\Categories;
use App\Models\Difficulties;
use App\Models\AgeManagement;
use App\Models\Article_master;
use App\Models\Article;
use App\Models\Product_master;
use App\Models\Product_details;
use App\Models\Guide_master;
use App\Models\Guide;
use Image;
use File;
use FFMpeg;
use FFMpeg\Coordinate\Dimension;
use FFMpeg\Format\Video\X264;
use Illuminate\Support\Facades\Storage;

/**
 * Class VideosController.
 */
class VideosController extends Controller
{
	/**
     * @var model
     * @var categoryModel
     * @var difficultModel
     * @var languagesModel
     * @var videoDetailsModel
     * @var ageManagementModel
     */
    protected $model;
    protected $categoryModel;
    protected $difficultModel;
    protected $languagesModel;
    protected $videoDetailsModel;
    protected $ageManagementModel;

    /**
     * VideosController constructor.
     *
     * @param model $model
     * @param categoryModel $categoryModel
     * @param difficultModel $difficultModel
     * @param languagesModel $languagesModel
     * @param videoDetailsModel $videoDetailsModel
     * @param ageManagementModel $ageManagementModel
     */

    public function __construct()
    {
        $this->model = new Videos;
        $this->categoryModel = new Categories;
        $this->difficultModel = new Difficulties;
        $this->languagesModel = new Languages;
        $this->videoDetailsModel = new VideoDetails;
        $this->ageManagementModel = new AgeManagement;
        $this->productMasterModel  = new Product_master;
        $this->productModel = new Product_details;
        $this->articleMasterModel  = new Article_master;
        $this->articleModel = new Article;
        $this->guideMasterModel  = new Guide_master;
        $this->guideModel = new Guide;
    }

    /**
     * Videos list method.
     *
     */

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

    }

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

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

    /**
     * videos delete method.
     *
     * @param $req
     *
     * @return redirection
     */
    public function delete(Request $req){
    	$videos_id = base64_decode($req->id);
        $videosdetails = $this->model->find($videos_id);
        $articledetails = $this->articleMasterModel->where('video_id',$videos_id)->get();
        $product_details =  $this->productMasterModel->where('video_id',$videos_id)->get();
        $guide_details    = $this->guideMasterModel->where('video_id',$videos_id)->get();
        if($articledetails){
            foreach($articledetails as $article){
                //dd($article);
                $article_id = $article->id;
               
                $this->articleModel
                ->where(['master_id' => $article_id])->delete();
                $this->articleMasterModel->find($article_id)->delete();
            }
        }

        if($product_details){
            foreach($product_details as $product){
                $product_id = $product->id;
                
                $this->productModel
                ->where(['master_id' => $product_id])->delete();
                $this->productMasterModel->find($product_id)->delete();
            }
        }
        if($guide_details){
            foreach($guide_details as $guide){
                $guide_id = $guide->id;
                
                $this->guideModel
                ->where(['master_id' => $guide_id])->delete();
                $this->guideMasterModel->find($guide_id)->delete();
            }
    	}
    	if($videosdetails){
            $this->videoDetailsModel->where('video_id', $videos_id)->delete();
    		$this->model->find($videos_id)->delete();
    		session()->flash('success', 'videos Deleted Successfully');
            return redirect()->route('admin.video');
    	} else {
    		session()->flash('error', 'Videos Not Found');
            return redirect()->route('admin.video');
    	}
    }

    /**
     * videos add method.
     *
     * @param $req
     *
     * @return redirection
     */
    public function add(){
        $languages    = $this->languagesModel->get();
        $categories   = $this->categoryModel->where('status',1)->get();
        $difficulties = $this->difficultModel->get();
        $agerecom     = $this->ageManagementModel->get();
        return view('admin.pages.videos.add')
                ->withCategories($categories)
                ->withLanguages($languages)
                ->withDifficulties($difficulties)
                ->withAgerecom($agerecom);
    }

    /**
     * Videos 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['title.'.$key.'.required'] = 'Please Fill '.$language->name.' Title Field';
                $messages['title.'.$key.'.unique'] = 'The '.$language->name.' title has already been taken';
            }

            $req->validate([
                'title.*' => 'required|max:255|unique:video_details,title',
                'video_pic' => 'required|mimes:jpeg,jpg,png,gif|max:10000',
                //'video_file' => 'required|mimes:mp4,mov,ogg,qt',
                'video_type' => 'required',
                'age_recom' => 'required',
                'category_id' => 'required',
                'difficulty_id' => 'required'
            ], $messages);
            /**
            *Image upload operation
            **/
            $filename = '';
            if($req->file('video_pic')){
                if($req->file('video_pic')->isValid()){                    
                    $file = $req->file('video_pic');
                    $filename = time().str_random(5).'.'.$file->getClientOriginalExtension();
                    $path = 'videos';
                    $destination = public_path('storage/videos/thumb');
                    $upload_location = $path.'/'.$filename;
                    $img = Image::make($file->getRealPath());
                    $img->resize(260, 260, function ($constraint) {
                        $constraint->aspectRatio();
                    })->save($destination.'/'.$filename);
                }
            }

            $s3FilePath=""; 
            if($req->file('video_file')){
                //Insert New Image
                $videofile = $req->file('video_file');
                //print_r($videofile);die;
                //Create Image Name
                $arrayFileName = explode(".", $videofile->getClientOriginalName());  
                $video_file =  $videofile->getClientOriginalName();
                $storage_path_full = '/'.$video_file;
                     
                $videofile->move(public_path('storage/videos/'), $videofile->getClientOriginalName());
                $video = $arrayFileName[0] . date('his') . '.mp4';
                $s3FilePath = $arrayFileName[0] . date('his') . '.mp4';                    

                $lowBitrateFormat = (new X264('libmp3lame', 'libx264'))->setKiloBitrate(250);
                $midBitrateFormat = (new X264('libmp3lame', 'libx264'))->setKiloBitrate(500);
                $highBitrateFormat = (new X264('libmp3lame', 'libx264'))->setKiloBitrate(1000);

                /*$ffprobe = FFMpeg\FFProbe::create();
                $video_dimensions = $ffprobe
                        ->streams($videofile)   
                        ->videos()                      
                        ->first()                       
                        ->getDimensions();              
                        
                $width = $video_dimensions->getWidth();
                $height = $video_dimensions->getHeight();*/ 
                $width = 720;
                $height = 1040;                        

                if($arrayFileName[1] == 'mp4'){
                    FFMpeg::fromDisk('babygym')
                        ->open($video_file)
                        ->addFilter(function ($filters) use ($height, $width){
                                $filters->resize(new Dimension(960, 540));
                            })
                        ->export()
                        ->toDisk('babygym')
                        ->inFormat($midBitrateFormat)
                        ->save($s3FilePath);
                } elseif($arrayFileName[1] == 'mkv') {
                    session()->flash('errors', 'mkv format not suported');
                    return redirect()->route('admin.videoAdd');
                } else {
                    FFMpeg::fromDisk('babygym')
                        ->open($video_file)
                        ->addFilter(function ($filters) use ($height, $width){
                            $filters->resize(new Dimension(960, 540));
                        })
                        ->export()
                        ->toDisk('babygym')
                        ->inFormat($midBitrateFormat)
                        ->inFormat(new \FFMpeg\Format\Video\X264)
                        ->save($s3FilePath);
                }
            }
            
            $insert_arr = [
                'title' => $req->title[0],
                'image' => $filename,
                'video_file' => $s3FilePath,
                'about' => $req->about[0],
                'video_type' => $req->video_type,
                'age_recom' => $req->age_recom,
                'category_id' => $req->category_id,
                'difficulty_id' => $req->difficulty_id,
                'download_opt' => 0,
                'status' => 1
            ];
            $insert = $this->model->create($insert_arr);

            foreach ($languages as $key => $language) {
                $insert__details_arr = [
                    'title' => $req->title[$key],
                    'about' => $req->about[$key],
                    'video_id' => $insert->id,
                    'language_id' => $language->id
                ];
                $this->videoDetailsModel->create($insert__details_arr);
            }

            session()->flash('success', 'Videos Details Added Successfully');
            return redirect()->route('admin.video');
        }
    }

    /**
     * Videos edit method.
     *
     * @param $req
     *
     * @return redirection
     */
    public function edit(Request $req){
    	$videos_id = base64_decode($req->id);
        $languages = $this->languagesModel->get();
        $categories = $this->categoryModel->where('status',1)->get();
        $videodetailsValues = $this->videoDetailsModel->where('video_id', $videos_id)->get();
        $difficulties = $this->difficultModel->get();
        $videosdetails = $this->model->find($videos_id);
        $agerecom     = $this->ageManagementModel->get();
    	if($videosdetails){
    		return view('admin.pages.videos.edit')
                ->withVideosdetails($videosdetails)
                ->withLanguages($languages)
                ->withCategories($categories)
                ->withVideodetailsValues($videodetailsValues)
                ->withDifficulties($difficulties)
                ->withAgerecom($agerecom);
                
    	} else {
    		session()->flash('error', 'Videos Not Found');
            return redirect()->route('admin.video');
    	}
    }

    /**
     * Videos details update method.
     *
     * @param $req
     *
     * @return redirection
     */
    public function update(Request $req){
    	$videos_id = base64_decode($req->id);
    	$videosdetails = $this->model->find($videos_id);
    	if($videosdetails){
        	/**
        	*post operation
        	**/
        	if($req->post()){
                $languages = $this->languagesModel->get();
                $messages = [];
                foreach ($languages as $key => $language) {
                    $messages['title.'.$key.'.required'] = 'Please Fill '.$language->name.' Title Field';
                    $messages['title.'.$key.'.unique'] = 'The '.$language->name.' title has already been taken';
                }
        		$req->validate([
    			    'title.*' => 'required|max:255|unique:video_details,title,'.$videos_id.',video_id',
                    'video_type' => 'required',
                    'age_recom' => 'required',
                    'category_id' => 'required',
                    'difficulty_id' => 'required'
    			], $messages);
        		/**
    	    	*Image upload operation
    	    	**/
    			$filename = '';
                if($req->file('video_pic')){
                	if($req->file('video_pic')->isValid()){
                		if (File::exists(public_path('storage/videos/thumb/'.$videosdetails->image))) {
    				        unlink(public_path('storage/videos/thumb/'.$videosdetails->image));//unlik uploaded file
    				    }
    	            	$file = $req->file('video_pic');
    					$filename = time().str_random(5).'.'.$file->getClientOriginalExtension();
    	                $path = 'videos';
    	                $destination = public_path('storage/videos/thumb');
    	                $upload_location = $path.'/'.$filename;
    	                $img = Image::make($file->getRealPath());
    	                $img->resize(260, 260, function ($constraint) {
    	                    $constraint->aspectRatio();
    	                })->save($destination.'/'.$filename);
                	}
                }

                /**
                *Upload video section
                **/
                $s3FilePath=""; 
                if($req->file('video_file')){
                    //Insert New Image
                    $videofile = $req->file('video_file');
                    //Create Image Name
                    $arrayFileName = explode(".", $videofile->getClientOriginalName());  
                    $video_file =  $videofile->getClientOriginalName();
                    $storage_path_full = '/'.$video_file;
                         
                    $videofile->move(public_path('storage/videos/'), $videofile->getClientOriginalName());
                    $video = $arrayFileName[0] . date('his') . '.mp4';
                    $s3FilePath = $arrayFileName[0] . date('his') . '.mp4';                    

                    $lowBitrateFormat = (new X264('libmp3lame', 'libx264'))->setKiloBitrate(250);
                    $midBitrateFormat = (new X264('libmp3lame', 'libx264'))->setKiloBitrate(500);
                    $highBitrateFormat = (new X264('libmp3lame', 'libx264'))->setKiloBitrate(1000);

                    /*$ffprobe = FFMpeg\FFProbe::create();
                    $video_dimensions = $ffprobe
                            ->streams($videofile)   
                            ->videos()                      
                            ->first()                       
                            ->getDimensions();              
                            
                    $width = $video_dimensions->getWidth();
                    $height = $video_dimensions->getHeight();*/ 
                    $width = 720;
                    $height = 1040;                        

                    if($arrayFileName[1] == 'mp4'){
                        FFMpeg::fromDisk('babygym')
                            ->open($video_file)
                            ->addFilter(function ($filters) use ($height, $width){
                                    $filters->resize(new Dimension(960, 540));
                                })
                            ->export()
                            ->toDisk('babygym')
                            ->inFormat($midBitrateFormat)
                            ->save($s3FilePath);
                    } elseif($arrayFileName[1] == 'mkv') {
                        session()->flash('errors', 'mkv format not suported');
                        return redirect()->route('admin.videoAdd');
                    } else {
                        FFMpeg::fromDisk('babygym')
                            ->open($video_file)
                            ->addFilter(function ($filters) use ($height, $width){
                                $filters->resize(new Dimension(960, 540));
                            })
                            ->export()
                            ->toDisk('babygym')
                            ->inFormat($midBitrateFormat)
                            ->inFormat(new \FFMpeg\Format\Video\X264)
                            ->save($s3FilePath);
                    }
                }

                $update_arr = [
                	'title' => $req->title[0],
                    'about' => $req->about[0],
                    'video_type' => $req->video_type,
                    'age_recom' => $req->age_recom,
                    'category_id' => $req->category_id,
                    'difficulty_id' => $req->difficulty_id,
                ];
                if($filename){
                    $update_arr['image'] = $filename;
                }
                if($s3FilePath){
                    $update_arr['video_file'] = $s3FilePath;
                    if (File::exists(public_path('storage/videos/'.$videosdetails->video_file))) {
                        unlink(public_path('storage/videos/'.$videosdetails->video_file));//unlik uploaded file
                    }
                }
                $this->model->find($videos_id)->update($update_arr);

                foreach ($languages as $key => $language) {
                    $packageDetailsData = $this->videoDetailsModel
                        ->where([
                                'video_id' => $videos_id,
                                'language_id' => $language->id
                        ])->first();
                    if(!$packageDetailsData){
                        $insert__details_arr = [
                            'title' => $req->title[$key],
                            'about' => $req->about[$key],
                            'video_id' => $videos_id,
                            'language_id' => $language->id
                        ];
                        $this->videoDetailsModel->create($insert__details_arr);
                    } else {
                        $update_details_arr = [
                            'title' => $req->title[$key],
                            'about' => $req->about[$key]
                        ];
                        $this->videoDetailsModel
                            ->where([
                                    'video_id' => $videos_id,
                                    'language_id' => $language->id
                            ])
                        ->update($update_details_arr);
                    }
                }

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


}
