<?php

namespace Modules\Blog\Http\Controllers;


// use App\Models\Category;
use Illuminate\Http\Request;
// use Modules\Tag\Entities\Tag;
use Modules\Blog\Entities\Post;
use Illuminate\Routing\Controller;
use Modules\Blog\Actions\CreatePost;
use Modules\Blog\Actions\DeletePost;
use Modules\Blog\Actions\UpdatePost;
use Modules\Blog\Entities\PostCategory;
use Illuminate\Contracts\Support\Renderable;
use Modules\Blog\Http\Requests\PageFormRequest;
use Illuminate\Support\Carbon;

use Illuminate\Foundation\Validation\ValidatesRequests;
// use Modules\Blog\Entities\PostComment;
use App\Models\Category;
use App\Models\Countries;
use App\Models\Tag;
use App\Models\Page;
use App\Models\PageComment;
use App\Models\Universities;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Auth;
use Intervention\Image\Facades\Image;
use Illuminate\Http\File;



class BlogController extends Controller
{
    use ValidatesRequests;

    public function __construct()
    {
        $this->middleware(['permission:post.view'])->only('index');
        $this->middleware(['permission:post.create'])->only(['create', 'store']);
        $this->middleware(['permission:post.update'])->only(['edit', 'update']);
        $this->middleware(['permission:post.delete'])->only(['destroy']);
    }

    /**
     * Display a listing of the post list.
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        abort_if(!userCan('page.view'), 403);
        // $categories = Category::where('type', 'page')->get();
        $categories = Category::where('type', 'page')->with('subCategory')->where('parent_id', 0)->get()->toArray();
        $authors = Page::select('author_id')->with('author:id,name,name')->get()->groupBy('author_id');
        $totalPages = Page::count();
        $totalComments = PageComment::count();
        $totalAuthor = $authors->count();
        // $totalCategory = $categories->count();
        $totalCategory = count($categories);
        // dd($totalCategory);
        $totalDraft = Page::where('status', 'draft')->count();
        $totalPublished = Page::where('status', 'published')->count();
        $totalUnpublished = Page::where('status', 'unpublished')->count();



        $query = Page::with('category', 'author:id,name,name')
        ->withCount('comments');
      
        if ($request->keyword && $request->keyword != null) {
            $query->where('title', 'LIKE', "%$request->keyword%");
        }

        if ($request->category && $request->category != null) {
            $category = $request->category;
            $query->whereHas('category', function ($q) use ($category) {
                $q->where('id', $category);
                $q->orWhere('parent_id', $category);
            });
        }

        if ($request->author && $request->author != null) {
            $author = $request->author;
            $query->whereHas('author', function ($q) use ($author) {
                $q->where('id', $author);
            });
        }

        if ($request->status && $request->status != null) {
            $query->where('status', $request->status);
        }

           // sortby
            if ($request->sort_by == 'latest' || $request->sort_by == null) {
               $query->latest();
            } else if ($request->sort_by == 'latestUpdate' || $request->sort_by == null) {
                $query->latest("updated_at");
            } 
            else if ($request->sort_by == 'oldest' || $request->sort_by == null) {
                $query->oldest();
            } 
            else if ($request->sort_by == 'oldestUpdate' || $request->sort_by == null) {
                $query->oldest("updated_at");
            } else {
                $query->latest();
            }

       
        $blogs = $query->paginate('15')->withQueryString();
        


        return view('blog::index', compact('blogs', 'categories','totalCategory', 'authors', 'totalComments', 'totalAuthor', 'totalPages', 'totalDraft', 'totalPublished','totalUnpublished'));
    }

    /**
     * Show the form for creating a new post.
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        abort_if(!userCan('page.create'), 403);
        // $categories = Category::where('type', 'page')->get();
        $categories = Category::where('type', 'page')->with('subCategory')->where('parent_id', 0)->get()->toArray();
        $tags = Tag::all();
        $countries = Countries::all();
        $universities = Universities::where('status', 1)->get(['id', 'name']);
        // $created_by_name  = createdAuthName(300);

        return view('blog::create', compact('categories','tags','countries','universities'));
    }

    /**
     * Store a newly created resource in storage.
     * @param PageFormRequest $request
     * @return \Illuminate\Http\RedirectResponse
     */
    public function store(Request $request)
    {
       
        abort_if(!userCan('page.create'), 403);
        $validatedData = $request->validate([
            'title' => "required|unique:pages,title",
            'description' => "required",
            'url' => "required",
            // 'robots' => "required",
            'category_id' => "required",
            'country_id' => "required_if:category_id,16",
    ]);

        $folder = '/uploads/pages';
        if(!empty(isset($request['image']))){
            $file_image = $request->file('image');
        }

        if(!empty(isset($request['bannerPdf']))){
            $file_bannerPdf = $request->file('bannerPdf');
        }

        if(!empty($request->tag_id)){
            $tag_ids = implode(",", $request->tag_id);
        }else {
            $tag_ids = null;
        }

        $requestData = $request->all();

        $requestData['tag_id']= $tag_ids;
        // $request['display_date'] = 
        unset($requestData['created_at']);

        if(!empty(isset($file_image))){
            $path_image = Storage::disk('public')->put($folder, $file_image);
            $requestData['image']= $path_image;
        }

        if(!empty(isset($file_bannerPdf))){
            // $path_bannerPdf = Storage::disk('public')->put($folder, $file_bannerPdf);
            // $requestData['bannerPdf']= $path_bannerPdf;

            $originalFileName = $file_bannerPdf->getClientOriginalName();
            $path_bannerPdf = Storage::disk('public')->putFileAs($folder, $file_bannerPdf, $originalFileName);
            $requestData['bannerPdf'] = $path_bannerPdf;
        }
        $page = Page::create($requestData);

        if ($page) {      
            if ($request->button_type == 'save_close_button') {
                flashSuccess(__('page_created_successfully'));
                return redirect()->route('module.blog.index');
            }else{
                flashSuccess(__('page_created_successfully'));
                return redirect()->route('module.blog.edit', $page->id);
            }
        } else {
            flashError();
            return back();
        }

        // if (isset($request->save_close_button)) {
        //     if ($page) {
        //         flashSuccess(__('page_created_successfully'));
        //         return redirect()->route('module.blog.index');
        //     } else {
        //         flashError();
        //         return back();
        //     }
        // } else { 
        //     if ($page) {
        //         flashSuccess(__('page_created_successfully'));
        //         return redirect()->route('module.blog.edit', $page->id);
        //     } else {
        //         flashError();
        //         return back();
        //     }
        // }
    }

    /**
     * Show the form for editing the specified Page.
     * @param Page $page
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        abort_if(!userCan('page.update'), 403);
        $page = Page::findOrFail($id);
        // $categories = Category::where('type', 'page')->with('subCategory')->where('parent_id', 0)->get();
        $categories = Category::where('type', 'page')->with('subCategory')->where('parent_id', 0)->get()->toArray();
        $tag_ids = explode(",", $page->tag_id);
        $tags = Tag::all();

        $countries = Countries::all();
        $universities = Universities::where('status', 1)->get(['id', 'name']);

        return view('blog::edit', compact('categories', 'page', 'tags', 'tag_ids','countries','universities'));
    }

    /**
     * Update the specified resource in storage.
     * @param PageFormRequest $request
     * @param Post $post
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {

       
        abort_if(!userCan('page.update'), 403);

       $folder = '/uploads/pages';
       $page = Page::where('id', $id)->first();


       $validatedData = $request->validate([
            'title' => "required|unique:pages,title,{$id}",
            // 'image' => "image|mimes:jpeg,png,jpg",
            'description' => "required",
            'url' => "required",
            // 'robots' => "required",
            // 'tag_id' => "required",
            'category_id' => "required",
            'country_id' => "required_if:category_id,16",
        ]);


       if(!empty($request->tag_id)){
           $tag_ids = implode(",", $request->tag_id);
           $request['tag_id'] = $tag_ids;
       }else{
           $request['tag_id'] = NUll;
       }

       $file_images = ($request->file('image'))? $request->file('image'): NULL;
       // dd($request->all());
       if (!empty($file_images)) {
           if ($page['image'] && Storage::disk('public')->exists($page['image'])) {
               Storage::disk('public')->delete($page['image']);
           }
           $path_logo = Storage::disk('public')->put($folder, $file_images);
        //    DD($path_logo);
          
       }else{
           $path_logo = $page['image'];
       }


       $file_bannerPdf = ($request->file('bannerPdf'))? $request->file('bannerPdf'): NULL;
       // dd($request->all());
       if (!empty($file_bannerPdf)) {
           if ($page['bannerPdf'] && Storage::disk('public')->exists($page['bannerPdf'])) {
               Storage::disk('public')->delete($page['bannerPdf']);
           }
        //    $path_bannerPdf = Storage::disk('public')->put($folder, $file_bannerPdf);
        $originalFileName = $file_bannerPdf->getClientOriginalName();
        $path_bannerPdf = Storage::disk('public')->putFileAs($folder, $file_bannerPdf, $originalFileName);
        
        
          
       }else{
           $path_bannerPdf = $page['bannerPdf'];
       }

       $updateResult =   $page->update([
           'image' => $path_logo,
           'category_id' => $request->category_id,   
           'title' => $request->title,
           'short_description' => $request->short_description,
           'description' => $request->description,
           'status' => $request->status,
           'url' => $request->url,
           'tag_id' => $request->tag_id,
           'meta_description' => $request->meta_description,
           'meta_title' => $request->meta_title,
           'display_date' => $request->display_date,
           'relative_university' => $request->relative_university,
           'modified_by' => Auth()->user()->id,
           'meta_keywords' => $request->meta_keywords,
           'fields' => $request->fields,
           'page_header' => $request->page_header,
           'middle_content' => $request->middle_content,
           'country_id' => $request->country_id,   

           'admission_desc' => $request->admission_desc,
           'city_desc' => $request->city_desc,
           'cost_of_living_desc' => $request->cost_of_living_desc,
           'scholarship_desc' => $request->scholarship_desc,
           'visa_desc' => $request->visa_desc,
           'course_overview' => $request->course_overview,

           'header_title' => $request->header_title,
           'header_description' => $request->header_description,
           'parent_category_id' => $request->parent_category_id,
           'robots' => $request->robots,
           'imageAltText' => $request->imageAltText,
           'imageTitle' => $request->imageTitle,
           'similar_countries' => $request->similar_countries,
           'header_strip' => $request->header_strip,

           'bannerTitle' => $request->bannerTitle,
           'bannerButtonName' => $request->bannerButtonName,
           'bannerDescription' => $request->bannerDescription,
           'bannerPdf' => $path_bannerPdf,


           
           

       ]);
    //    dd($request->has('save_close_button'));
        if ($updateResult) {
            if ($request->button_type == 'save_close_button') {
                flashSuccess(__('page_updated_successfully'));
                return redirect()->route('module.blog.index');
            }else{
                flashSuccess(__('page_updated_successfully'));
                return redirect()->route('module.blog.edit', $page->id);
            }
        } else {
            flashError();
            return back();
        }

        // if ($page) {
        //     flashSuccess(__('page_updated_successfully'));
        //     return redirect()->route('module.blog.index');
        // } else {
        //     flashError();
        //     return back();
        // }
    }

    /**
     * Remove the specified post from storage.
     * @param Post $post
     * @return \Illuminate\Http\Response
     * @throws \Exception
     */
    public function destroy($id)
    {

        abort_if(!userCan('page.delete'), 403);
        $page = Page::findOrFail($id);
        // if(!empty(isset($page->image))){
        //     deleteFile($page->image);
        // }
        if ($page['image'] && Storage::disk('public')->exists($page['image'])) {
            Storage::disk('public')->delete($page['image']);
        }
        $page->delete();

        if ($page) {
            flashSuccess(__('page_deleted_successfully'));
            return back();
        } else {
            flashError();
            return back();
        }
    }

    public function clone(Request $request, $id)
    {
        abort_if(!userCan('page.update'), 403);
        $post = Page::find($id);
        $newPost = $post->replicate();
    
        $folder = 'uploads/pages';

        if (!empty($newPost->image)) {
            $image = Image::make($newPost->image);
            $tempFilePath = storage_path('app/public/temp.jpg');
            $image->save($tempFilePath);
            
            $file = new File($tempFilePath);
            $path_image = Storage::disk('public')->putFile($folder, $file);
            
            unlink($tempFilePath);
 
            $newPost->image = $path_image;
        } else {
            $newPost->image = null;
        }
        
        $newPost->created_at = Carbon::now();
        $newPost->save();
           
        if ($newPost->id) {
            flashSuccess(__('page_clone_successfully'));
           return redirect()->route('module.blog.edit', $newPost->id);
        } else {
            flashError();
            return back();
        }
        
        // return redirect()->route('module.blog.index');
    }





    public function pageCommentIndex(Request $request)
    {
        abort_if(!userCan('page.view'), 403);
        $comments = PageComment::all();
        return view('blog::comments.index', compact('comments'));
    }

    // public function pageCommentCreate(Request $request)
    // {
    //     dd($request->all());
    //     abort_if(!userCan('page.create'), 403);
    //     $categories = Category::where('type', 'page')->with('subCategory')->where('parent_id', 0)->get()->toArray();
    //     $page = Page::all();
    //     // $created_by_name  = createdAuthName(300);

    //     return view('blog::comments.create', compact('categories','page'));
    // }


    public function pageCommentEdit($id)
    {
        abort_if(!userCan('page.update'), 403);
        $pages = Page::all();
        
        $comment = PageComment::findOrFail($id);
        
        return view('blog::comments.edit', compact('comment','pages'));
    }


    public function pageCommentUpdate(Request $request, $id)
    {

        // dd($request->all());
        $request->validate([
            'comment' => 'required',
            'page_id' => 'required',
            'display_date' => 'required',
        ]);
        $comment = PageComment::findOrFail($id);
        $comment->page_id = $request->page_id;
        // $comment->parent_id = $request->parent_id;
        $comment->name = $request->name;
        $comment->email = $request->email;
        $comment->comment = $request->comment;
       
        if(!empty($comment->created_by)){
            $comment->created_by = $comment->created_by;
            $comment->user_type = $comment->user_type;
        }else{
            $comment->created_by = $request->created_by;
            $comment->user_type = "admin";
        }
        $comment->display_date = $request->display_date;
        $comment->url = $request->url;
        $comment->status = $request->status;
        $comment->save();
        flashSuccess(__('comment_edited_successfully'));
        return back();
    }


    public function pageCommentDestroy($id)
    {

        abort_if(!userCan('page.delete'), 403);
        $comment = PageComment::findOrFail($id);
        $comment->delete();

        if ($comment) {
            flashSuccess(__('comment_deleted_successfully'));
            return back();
        } else {
            flashError();
            return back();
        }
    }

    
}
