<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Packages;
use App\Models\PackageDetails;
use App\Models\Languages;
use App\Models\User;
use Image;
use File;

/**
 * Class PackagesController.
 */
class PackagesController extends Controller
{
	/**
     * @var model
     * @var usersModel
     * @var languagesModel
     * @var packageDetailsModel
     */
    protected $model;
    protected $usersModel;

    /**
     * PackagesController constructor.
     *
     * @param model $model
     * @param usersModel $usersModel
     * @param languagesModel $languagesModel
     * @param packageDetailsModel $packageDetailsModel
     */

    public function __construct()
    {
        $this->model = new Packages;
        $this->usersModel = new User;
        $this->languagesModel = new Languages;
        $this->packageDetailsModel = new PackageDetails;
    }

    /**
     * Packages list method.
     *
     */

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

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

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

    /**
     * Package delete method.
     *
     * @param $req
     *
     * @return redirection
     */
    public function delete(Request $req){
    	$package_id = base64_decode($req->id);
    	$packagedetails = $this->model->find($package_id);
        $user_having_this_package = $this->usersModel->where('package_id', $package_id)->first();
    	if($packagedetails){
            if($user_having_this_package){
                session()->flash('error', 'This package related to a user, so could not be deleted');
            } else {
                $this->packageDetailsModel->where('package_id', $package_id)->delete();
                $this->model->find($package_id)->delete();
                session()->flash('success', 'Package Deleted Successfully');
            }
            return redirect()->route('admin.package');
    	} else {
    		session()->flash('error', 'Package Not Found');
            return redirect()->route('admin.package');
    	}
    }

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

    /**
     * Package 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:package_details,name',
                'price' => 'required|numeric',
                'duration' => 'required',
                'package_pic' => 'mimes:jpeg,jpg,png,gif|max:10000'
            ], $messages);
            /**
            *Image upload operation
            **/
            $filename = '';
            if($req->file('package_pic')){
                if($req->file('package_pic')->isValid()){                    
                    $file = $req->file('package_pic');
                    $filename = time().str_random(5).'.'.$file->getClientOriginalExtension();
                    $path = 'packages';
                    $destination = public_path('storage/packages');
                    $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],
                'price' => $req->price,
                'duration' => $req->duration,
                '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],
                    'package_id' => $insert->id,
                    'language_id' => $language->id
                ];
                $this->packageDetailsModel->create($insert__details_arr);
            }

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

    /**
     * Package edit method.
     *
     * @param $req
     *
     * @return redirection
     */
    public function edit(Request $req){
    	$package_id = base64_decode($req->id);
        $languages = $this->languagesModel->get();
    	$packagedetails = $this->model->find($package_id);
        $packagedetailsValues = $this->packageDetailsModel->where('package_id', $package_id)->get();
    	if($packagedetails){
    		return view('admin.pages.packages.edit')
                ->withPackagedetails($packagedetails)
                ->withLanguages($languages)
                ->withPackagedetailsValues($packagedetailsValues);
    	} else {
    		session()->flash('error', 'Package Not Found');
            return redirect()->route('admin.package');
    	}
    }

    /**
     * Package details update method.
     *
     * @param $req
     *
     * @return redirection
     */
    public function update(Request $req){
    	$package_id = base64_decode($req->id);
    	$packagedetails = $this->model->find($package_id);
    	if($packagedetails){
        	/**
        	*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:2555|unique:package_details,name,'.$package_id.',package_id',
                    'price' => 'required|numeric',
                    'duration' => 'required',
                    'package_pic' => 'mimes:jpeg,jpg,png,gif|max:10000'
    			], $messages);
        		/**
    	    	*Image upload operation
    	    	**/
    			$filename = '';
                if($req->file('package_pic')){
                	if($req->file('package_pic')->isValid()){
                		if (File::exists(public_path('storage/packages/'.$packagedetails->image))) {
    				        unlink(public_path('storage/packages/'.$packagedetails->image));//unlik uploaded file
    				    }
    	            	$file = $req->file('package_pic');
    					$filename = time().str_random(5).'.'.$file->getClientOriginalExtension();
    	                $path = 'packages';
    	                $destination = public_path('storage/packages');
    	                $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],
                    'price' => $req->price,
                    'duration' => $req->duration
                ];
                if($filename){
                	$update_arr['image'] = $filename;
                }
                $this->model->find($package_id)->update($update_arr);

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

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