<?php

namespace App\Http\Controllers\Admin;

use App\Models\Article;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Languages;
use App\Models\Article_master;
use App\Models\Videos;
use Image;
use File;
use FFMpeg;
use FFMpeg\Coordinate\Dimension;
use FFMpeg\Format\Video\X264;


class ArticleController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function __construct()
    {
        $this->langModel    = new Languages;
        $this->masterModel  = new Article_master;
        $this->articleModel = new Article;
        $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.article.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)
    {
        //dd($req);
        $languages      = $this->langModel->where('status', 1)->get();
        $masterTitle    = $req->title[0];
        $masterDesc     = $req->desc[0];
        $masterLang     = $req->lang_id[0];
        $vdo_id         = $req->video;
        $video_cat_id   = $req->video_cat;
        $vdo_url        = (($req->vdo_url)?$req->vdo_url:'');
        $url_type       = $req->url_type;

        foreach($languages as $key => $val){
            $validate['title.'.$key] = 'required|unique:articles,title';
            $validate['desc.'.$key] = 'required';
            $validate['image_file'] = 'image|mimes:jpeg,png,jpg,gif';

            $msg['title.' . $key. '.required'] = 'Title '.$val->name.' is required';
            $msg['title.' . $key. '.unique'] = 'Title '.$val->name.' is already taken';
            $msg['desc.' . $key. '.required'] = 'Description '.$val->name. ' is required';
            $msg['image_file.mimes'] = 'Image should be jpg,png,jpeg,gif format';
        }

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

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



            $insert_arr = [
                'title'        => $masterTitle,
                'description'  => $masterDesc,
                'lang_id'      => $masterLang,
                'video_id'     => $req->video,
                'video_cat_id' => $video_cat_id,
                'video'        => $vdo_url,
                'video_type'   => $url_type
            ];
            if($filename){
                $insert_arr['image'] = $filename;
            }
          
            $insert = $this->masterModel->create($insert_arr);

            foreach ($languages as $key => $language) {
                $insert__details_arr = [
                    'title'       => $req->title[$key],
                    'description' => $req->desc[$key],
                    'lang_id'     => $req->lang_id[$key],
                    'master_id'   => $insert->id
                ];
                $this->articleModel->create($insert__details_arr);
            }

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

     /**
     * Display the specified resource.
     *
     * @param  \App\Article  $article
     * @return \Illuminate\Http\Response
     */
    public function show(Request $req)
    {
        $video_id = base64_decode($req->video_id);
        $video_details = $this->videoModel->where('id', $video_id)->first();
        $articleList = $this->masterModel->where('video_id', $video_details->id)->get();
        return view('admin.pages.article.list', compact('articleList'),compact('video_details'));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Article  $article
     * @return \Illuminate\Http\Response
     */
    public function edit(Request $req)
    {
        $article_id = base64_decode($req->id);
        $languages = $this->langModel->get();
        $articledetails = $this->masterModel->find($article_id);
        $articledetailsValues = $this->articleModel->where('master_id', $article_id)->get();
        $videos    = $this->videoModel->where('status', 1)->get();
        if($articledetails){
            return view('admin.pages.article.edit')
                ->witharticledetails($articledetails)
                ->withLanguages($languages)
                ->witharticledetailsValues($articledetailsValues)->withVideos($videos);
        } else {
            session()->flash('error', 'Article Not Found');
            return redirect()->route('admin.article');
        }
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Article  $article
     * @return \Illuminate\Http\Response
     */
    public function update(Request $req)
    {
        // $data = $this->validate($req, [
        //     'title.*'         =>'required|unique:articles,title,'.$req->master_article_id.',master_id',
        //     'desc.*'          =>'required',
        //     'image_file.*'    =>'image|mimes:jpeg,png,jpg,gif',
        //     'vdo_file.*'      =>'image|mimes:mp4,mov,ogg,3gp| max:20000'
        // ],
        // [
        //     'image_file.*'.'image' => 'Please add an image',
        //     'image_file.*'.'mimes' => 'Image File should be jpeg,png,jpg,gif,',
            
        // ]);



        $master_article_id = $req->master_article_id;
        $article_detail = $this->masterModel->find($master_article_id);
        $video_id       = $req->video;
        $vdo_url        = (($req->vdo_url)?$req->vdo_url:'');
        $url_type       = $req->url_type;
        if($article_detail){
            if($req->post()){
                $filename = '';
                $languages = $this->langModel->get();

                foreach($languages as $key => $val){
                    $validate['title.'.$key] = 'required|unique:articles,title,'.$req->master_article_id.',master_id';
                    $validate['desc.'.$key] = 'required';
                    $validate['image_file'] = 'image|mimes:jpeg,png,jpg,gif';
        
                    $msg['title.' . $key. '.required'] = 'Title '.$val->name.' is required';
                    $msg['title.' . $key. '.unique'] = 'Title '.$val->name.' is already taken';
                    $msg['desc.' . $key. '.required'] = 'Description '.$val->name. ' is required';
                    $msg['image_file.mimes'] = 'Image should be jpg,png,jpeg,gif format';
                }
                $this->validate($req, $validate, $msg);
                
                if($req->file('image_file')){
                    if($req->file('image_file')->isValid()){
                        //dd($article_detail->image);
                        //var_dump(File::exists(public_path('storage/articles/images/'.$article_detail->image)));die();
                        if (File::exists(public_path('storage/articles/images/'.$article_detail->image))) {
                            @unlink(public_path('storage/articles/images/'.$article_detail->image));//unlik uploaded file
                        }
                        $file = $req->file('image_file');
                        $filename = time().str_random(5).'.'.$file->getClientOriginalExtension();
                        $path = 'images';
                        $destination = public_path('storage/articles/images');
                        $upload_location = $path.'/'.$filename;
                        $img = Image::make($file->getRealPath());
                        $img->resize(250, 250, function ($constraint) {
                            $constraint->aspectRatio();
                        })->save($destination.'/'.$filename);
                    }
                }

                $update_arr = [
                    'title'        => $req->title[0],
                    'description'  => $req->desc[0],
                    'lang_id'      => $req->lang_id[0],
                    'video_id'     => $req->video,
                    'video'        => $vdo_url,
                    'video_type'   => $url_type
                ];
                if($filename){
                    $update_arr['image'] = $filename;
                }
                $this->masterModel->find($master_article_id)->update($update_arr);
                foreach ($languages as $key => $language) {
                    $articleDetailsData = $this->articleModel
                        ->where([
                                'master_id' => $master_article_id,
                                'lang_id' => $language->id
                        ])->first();
                    if(!$articleDetailsData){
                        $insert__details_arr = [
                            'title' => $req->title[$key],
                            'description' => $req->desc[$key],
                            'lang_id' => $language->id,
                            'master_id' => $master_article_id
                        ];
                        $this->articleModel->create($insert__details_arr);
                    } else {
                        $update_details_arr = [
                            'title' => $req->title[$key],
                            'description' => $req->desc[$key],
                        ];
                        $this->articleModel
                            ->where([
                                    'master_id' => $master_article_id,
                                    'lang_id' => $language->id
                            ])
                        ->update($update_details_arr);
                    }
                }
                session()->flash('success', 'Article Details Updated Successfully');
                return redirect()->route('admin.article',base64_encode($video_id));
            }else {
                session()->flash('error', 'Article Not Found');
                return redirect()->route('admin.article',base64_encode($video_id));
            }
        }
    }

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

    public function status(Request $req){
        $master_article_id = base64_decode($req->id);
        $master_article_detail = $this->masterModel->find($master_article_id);
        if($master_article_detail){
            $new_status = ($master_article_detail->status == 2) ? 1 : 2;
            $this->masterModel->find($master_article_id)->update(['status'=>$new_status]);
            session()->flash('success', 'Article Status Changed Successfully');
            return redirect()->route('admin.article');
        }else{
            session()->flash('error', 'Article Not Found');
            return redirect()->route('admin.article');
        }
    }
    public function delete(Request $req){
        $article_id = base64_decode($req->id);
        $articledetails = $this->masterModel->find($article_id);
        if($articledetails){
            // if($user_having_this_package){
            //     session()->flash('error', 'This package related to a user, so could not be deleted');
            // } else {
                $this->masterModel->find($article_id)->delete();
                $this->articleModel
                ->where(['master_id' => $article_id])->delete();
                session()->flash('success', 'Article Deleted Successfully');
            //}
            return redirect()->route('admin.article',base64_encode($articledetails->video_id));
        }else{
            session()->flash('error', 'Article Not Found');
            return redirect()->route('admin.article',base64_encode($articledetails->video_id));
        }
    }
}
