<?php

namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Languages;
use App\Models\Product_master;
use App\Models\Product_details;
use App\Models\Videos;
use Image;
use File;

class ProductDetailsController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */

    public function __construct()
    {
        $this->langModel    = new Languages;
        $this->masterModel  = new Product_master;
        $this->productModel = new Product_details;
        $this->videoModel = new Videos;
    }

    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create(Request $req)
    {
        $video_id = base64_decode($req->video_id);
        $languages = $this->langModel->where('status', 1)->get();
        $video_details = $this->videoModel->where('id', $video_id)->first();
        //$videos    = $this->videoModel->where('status', 1)->get();
        return view('admin.pages.product.add')->withLanguages($languages)->withVideodetails($video_details);;
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $req)
    {
        $languages   = $this->langModel->where('status', 1)->get();
        $mastername  = $req->name[0];
        $masterLang  = $req->lang_id[0];
        $price       = $req->pro_price;
        $url         = $req->url;
        $vdo_id      = $req->video;

        // $data = $this->validate($req, [
        //     'name.*'        =>'required|unique:product_details,name|max:255',
        //     'product_pic'    =>'image|mimes:jpeg,png,jpg,gif'
            
        // ],
        // [
        //     'product_pic.*'.'image' => 'Please add an image',
        //     'product_pic.*'.'mimes' => 'Image File should be jpeg,png,jpg,gif,',
            
        // ]);

        foreach($languages as $key => $val){
            $validate['name.'.$key] = 'required|unique:product_details,name|max:255';
            $validate['product_pic'] = 'required|image|mimes:jpeg,png,jpg,gif';
            $validate['pro_price'] = 'required|numeric';
            $validate['url'] = 'required';

            $msg['name.' . $key. '.required'] = 'Name '.$val->name.' is required';
            $msg['name.' . $key. '.unique'] = 'Name '.$val->name.' is already taken';
            $msg['desc.' . $key. '.required'] = 'Description '.$val->name. ' is required';
            $msg['product_pic'] = 'image|mimes:jpeg,png,jpg,gif';
        }

        $this->validate($req, $validate, $msg);

        $filename = '';
        if($req->file('product_pic')){
            if($req->file('product_pic')->isValid()){                    
                $file = $req->file('product_pic');
                $filename = time().str_random(5).'.'.$file->getClientOriginalExtension();
                $path = 'images';
                $destination = public_path('storage/products/images');
                $upload_location = $path.'/'.$filename;
                $img = Image::make($file->getRealPath());
                $img->resize(250, 250, function ($constraint) {
                    $constraint->aspectRatio();
                })->save($destination.'/'.$filename);
            }
        }

        $insert_arr = [
            'name' => $mastername,
            'site_link' => $url,
            'price' => $price,
            'video_id' => $req->video,
            'language_id' =>$masterLang  
        ];
        if($filename){
            $insert_arr['image'] = $filename;
        }
        $insert = $this->masterModel->create($insert_arr);
        foreach ($languages as $key => $language) {
            $insert__details_arr = [
                'name'       => $req->name[$key],
                'language_id' => $req->lang_id[$key],
                'master_id'   => $insert->id
            ];
            $this->productModel->create($insert__details_arr);
        }

        session()->flash('success', 'Product Added Successfully');
        return redirect()->route('admin.product',base64_encode($vdo_id));
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Product_details  $product_details
     * @return \Illuminate\Http\Response
     */
    // public function show(Product_details $product_details)
    // {
    //     //
    //     dd("Hello");
    // }
    public function show(Request $req)
    {
        $video_id = base64_decode($req->video_id);
        $video_details = $this->videoModel->where('id', $video_id)->first();
        $productList = $this->masterModel->get();
        //return view('admin.pages.article.list')->withVideodetails($video_details)->witharticleLists($articleList);
        return view('admin.pages.product.list')->withproductList($productList)->withvideodetails($video_details);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Product_details  $product_details
     * @return \Illuminate\Http\Response
     */
    
    public function edit(Request $req)
    {
        $product_id = base64_decode($req->id);
        $languages = $this->langModel->get();
        $productdetails = $this->masterModel->find($product_id);
        $productdetailsValues = $this->productModel->where('master_id', $product_id)->get();
        $videos    = $this->videoModel->where('status', 1)->get();
    	if($productdetails){
    		return view('admin.pages.product.edit')
                ->withproductdetails($productdetails)
                ->withLanguages($languages)
                ->withproductdetailsValues($productdetailsValues)->withVideos($videos);
    	}else{
    		session()->flash('error', 'Product Not Found');
            return redirect()->route('admin.product');
    	}
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Product_details  $product_details
     * @return \Illuminate\Http\Response
     */
    public function update(Request $req)
    {
        //dd($req);
        $product_id = $req->master_product_id;
        $productdetails = $this->masterModel->find($product_id);
        //dd($productdetails);
        $video_id = $req->video;
    	if($productdetails){
        	/**
        	*post operation
        	**/
        	 if($req->post()){
                $languages = $this->langModel->get();

                foreach($languages as $key => $val){
                    $validate['name.'.$key] = 'required|unique:product_details,name,'.$req->master_product_id.',master_id';
                    $validate['product_pic'] = 'image|mimes:jpeg,png,jpg,gif';
                    $validate['price'] = 'required|numeric';
                    $validate['url'] = 'required';
        
                    $msg['name.' . $key. '.required'] = 'Name '.$val->name.' is required';
                    $msg['name.' . $key. '.unique'] = 'Name '.$val->name.' is already taken';
                    $msg['desc.' . $key. '.required'] = 'Description '.$val->name. ' is required';
                    $msg['product_pic'] = 'image|mimes:jpeg,png,jpg,gif';
                }
                $this->validate($req, $validate, $msg);

    			$filename = '';
                if($req->file('product_pic')){
                	if($req->file('product_pic')->isValid()){
                		if (File::exists(public_path('storage/packages/'.$productdetails->image))) {
    				        unlink(public_path('storage/packages/'.$productdetails->image));//unlik uploaded file
    				    }
    	            	$file = $req->file('product_pic');
    					$filename = time().str_random(5).'.'.$file->getClientOriginalExtension();
    	                $path = 'images';
    	                $destination = public_path('storage/products/images');
    	                $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,
                    'site_link' => $req->url
                ];
                if($filename){
                	$update_arr['image'] = $filename;
                }
                $this->masterModel->find($product_id)->update($update_arr);

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

                session()->flash('success', 'Product Details Updated Successfully');
                return redirect()->route('admin.product',base64_encode($video_id));
        	}
    	} else {
    		session()->flash('error', 'Product Not Found');
            return redirect()->route('admin.product',base64_encode($video_id));
    	}
    }

    

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Product_details  $product_details
     * @return \Illuminate\Http\Response
     */
    public function destroy(Product_details $product_details)
    {
        //
    }

    public function status(Request $req){
        $master_product_id = base64_decode($req->id);
        $master_product_detail = $this->masterModel->find($master_product_id);
        //dd($master_product_detail);
    	if($master_product_detail){
            $new_status = ($master_product_detail->status == 1) ? 0 : 1;
            $this->masterModel->find($master_product_id)->update(['status'=>$new_status]);
            session()->flash('success', 'Product Status Changed Successfully');
            return redirect()->route('admin.product', base64_encode($master_product_detail->video_id));
    	}else{
    		session()->flash('error', 'Product Not Found');
            return redirect()->route('admin.product',base64_encode($master_product_detail->video_id));
    	}
    }

    public function delete(Request $req){
    	$product_id = base64_decode($req->id);
        $product_details = $this->masterModel->find($product_id);
    	if($product_details){
            // if($user_having_this_package){
            //     session()->flash('error', 'This package related to a user, so could not be deleted');
            // } else {
               
                $this->productModel
                ->where(['master_id' => $product_id])->delete();
                session()->flash('success', 'Product Deleted Successfully');
                $this->masterModel->find($product_id)->delete();
            //}
            return redirect()->route('admin.product',base64_encode($product_details->video_id));
    	}else{
    		session()->flash('error', 'Article Not Found');
            return redirect()->route('admin.product',base64_encode($product_details->video_id));
    	}
    }
}
