<?php

namespace App\Http\Controllers\Admin;

use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Seo;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Page;
use App\Http\Resources\Admin\PageResource;
use Validator;

/**
 * Class PageController
 *
 * @package App\Http\Controllers
 */
class PageController extends Controller
{
    const ITEM_PER_PAGE = 25;

    public function index(Request $request)
    {
        $searchParams = $request->all();
        $list = Page::notDeleted();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $keyword = Arr::get($searchParams, 'keyword', '');
        $group = Arr::get($searchParams, 'group', '');
        $status = Arr::get($searchParams, 'status', '');

        if (!empty($keyword)) {
            $list->where('title', 'LIKE', '%' . $keyword . '%');
        }
        if (!empty($group)) {
            $list->where('group', $group);
        }
        if ($status != '') {
            $list->where('is_activated', $status);
        }
        $list->orderBy('id');

        return PageResource::collection($list->paginate($limit));
    }

    public function all(Request $request)
    {
        $searchParams = $request->all();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $list = Page::select('*')->notDeleted()->orderBy('id');

        return PageResource::collection($list->paginate($limit));
    }

    public function available(Request $request)
    {

        $ignoreId = Arr::get($request->all(), 'ignoreId', '');
        $list = Page::select('*')->isPublished();

        if ($ignoreId != null && $ignoreId != "") {
            $list->where('id', '!=', $ignoreId);
        }

        $list->orderBy('id');

        return PageResource::collection($list->get());
    }

    public function show($id = 0)
    {
        $page = Page::notDeleted()->where('id', $id)->first();
        if (!isset($page)) return response()->json([ 'errors' => 'Page is not valid' ], 403);

        return new PageResource($page);
    }

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [ 'title' => [ 'required' ], 'slug' => [ 'required' ], 'is_activated' => [ 'required' ] ]);
        if ($validator->fails()) return response()->json([ 'errors' => $validator->errors() ], 403);
        $params = $request->all();

        $checkPageTitle = Page::where('title', trim($params['title']))->where('is_deleted', 0)->count();
        if ($checkPageTitle > 0) return response()->json([ 'errors' => 'The page already exists.' ], 403);

        $slug = $params['slug'];
        if ($slug == null || $slug == "") $slug = Helper::slug($params['title']);
        /*$slug = "/" . $slug;
        $slug = str_replace("//", "", $slug);*/

        $checkSlug = Page::where('slug', trim($slug))
            ->where('is_deleted', 0)
            ->where('group', '!=', 2)
            ->count();
        if ($checkSlug > 0) return response()->json([ 'errors' => 'URL already exists.' ], 403);

        $page = Page::create([
            'title'        => trim($params['title']),
            'slug'         => trim($slug),
            'description'  => $params['description'],
            'content'      => $params['content'],
            'thumbnail'    => $params['thumbnail'],
            'group'        => $params['group'],
            'user_id'      => auth('api')->user()->id,
            'is_activated' => ($params['is_activated'] === true) ? 1 : 0,
            'created_at'   => date('Y-m-d H:i:s'),
            'updated_at'   => date('Y-m-d H:i:s')
        ]);

        //Seo
        $uri = '/page/' . $page->slug;
        if ($params['group'] === 2 || $params['group'] === "2") $uri = '/' . $page->slug;
        $checkSeo = Seo::where('uri', $uri)->first();
        if ($checkSeo) {
            $checkSeo->update([
                'title'       => $page->title . "【KIREI】",
                'type'        => 'custom',
                'is_amp'      => 0,
                'updated_at'  => date('Y-m-d H:i:s')
            ]);
        } else {
            Seo::create([
                'uri'         => $uri,
                'title'       => $page->title . "【KIREI】",
                'type'        => 'custom',
                'is_amp'      => 0,
                'created_at'  => date('Y-m-d H:i:s'),
                'updated_at'  => date('Y-m-d H:i:s')
            ]);
        }

        return new PageResource($page);
    }

    public function update(Request $request, $id = 0)
    {
        $validator = Validator::make($request->all(), [ 'title' => [ 'required' ], 'slug' => [ 'required' ], 'is_activated' => [ 'required' ] ]);
        if ($validator->fails()) return response()->json([ 'errors' => $validator->errors() ], 403);
        $page = Page::notDeleted()->where('id', $id)->first();
        if (!isset($page)) return response()->json([ 'errors' => 'Page is not valid' ], 403);

        $params = $request->all();

        $checkPageTitle = Page::where('title', trim($params['title']))
            ->where('id', '!=', $page->id)
            ->where('is_deleted', 0)
            ->count();
        if ($checkPageTitle > 0) return response()->json([ 'errors' => 'The page already exists.' ], 403);

        $slug = $params['slug'];
        if ($slug == null || $slug == "") $slug = Helper::slug($params['title']);
        /*$slug = "/" . $slug;
        $slug = str_replace("//", "", $slug);*/

        $checkSlug = Page::where('slug', trim($slug))
            ->where('id', '!=', $page->id)
            ->where('is_deleted', 0)
            ->where('group', '!=', 2)
            ->count();
        if ($checkSlug > 0) return response()->json([ 'errors' => 'URL already exists.' ], 403);

        $page->update([
            'title'        => trim($params['title']),
            'slug'         => trim($slug),
            'description'  => $params['description'],
            'content'      => $params['content'],
            'thumbnail'    => $params['thumbnail'],
            'group'        => $params['group'],
            'user_id'      => auth('api')->user()->id,
            'is_activated' => ($params['is_activated'] === true) ? 1 : 0,
            'created_at'   => date('Y-m-d H:i:s'),
            'updated_at'   => date('Y-m-d H:i:s')
        ]);

        //Seo
        $uri = '/page/' . $page->slug;
        if ($params['group'] === 2 || $params['group'] === "2") $uri = '/' . $page->slug;
        $checkSeo = Seo::where('uri', $uri)->first();
        if ($checkSeo) {
            $checkSeo->update([
                'title'       => $page->title . "【KIREI】",
                'type'        => 'custom',
                'is_amp'      => 0,
                'updated_at'  => date('Y-m-d H:i:s')
            ]);
        } else {
            Seo::create([
                'uri'         => $uri,
                'title'       => $page->title . "【KIREI】",
                'type'        => 'custom',
                'is_amp'      => 0,
                'created_at'  => date('Y-m-d H:i:s'),
                'updated_at'  => date('Y-m-d H:i:s')
            ]);
        }

        return response()->json(null, 204);
    }

    public function destroy($id = 0)
    {
        $page = Page::notDeleted()->where('id', $id)->first();
        if (!isset($page)) response()->json([ 'error' => 'Ehhh! Can not delete this page' ], 403);

        try {
            $page->update([ 'is_deleted' => true ]);
        } catch (\Exception $ex) {
            response()->json([ 'error' => $ex->getMessage() ], 403);
        }

        return response()->json(null, 204);
    }

    public function destroyMultiple(Request $request)
    {
        $validator = Validator::make($request->all(), [ 'ids' => 'required' ]);
        if ($validator->fails()) return response()->json([ 'errors' => $validator->errors() ], 403);
        $listIds = $request->get('ids', []);
        $pages = Page::notDeleted()->whereIn('id', $listIds)->get();
        if ($pages->count() <= 0) response()->json([ 'error' => 'Page is not valid.' ], 403);
        try {
            Page::notDeleted()->whereIn('id', $listIds)->update([ 'is_deleted' => true ]);
        } catch (\Exception $ex) {
            response()->json([ 'error' => $ex->getMessage() ], 403);
        }

        return response()->json(null, 204);
    }

    public function activateMultiple(Request $request)
    {
        $validator = Validator::make($request->all(), [ 'ids' => 'required' ]);
        if ($validator->fails()) return response()->json([ 'errors' => $validator->errors() ], 403);
        $listIds = $request->get('ids', []);
        $pages = Page::notDeleted()->whereIn('id', $listIds)->get();
        if ($pages->count() <= 0) response()->json([ 'error' => 'Page is not valid.' ], 403);
        try {
            Page::notDeleted()->whereIn('id', $listIds)->update([ 'is_activated' => true ]);
        } catch (\Exception $ex) {
            response()->json([ 'error' => $ex->getMessage() ], 403);
        }

        return response()->json(null, 204);
    }

    public function deactivateMultiple(Request $request)
    {
        $validator = Validator::make($request->all(), [ 'ids' => 'required' ]);
        if ($validator->fails()) return response()->json([ 'errors' => $validator->errors() ], 403);
        $listIds = $request->get('ids', []);
        $pages = Page::notDeleted()->whereIn('id', $listIds)->get();
        if ($pages->count() <= 0) response()->json([ 'error' => 'Page is not valid.' ], 403);
        try {
            Page::notDeleted()->whereIn('id', $listIds)->update([ 'is_activated' => false ]);
        } catch (\Exception $ex) {
            response()->json([ 'error' => $ex->getMessage() ], 403);
        }

        return response()->json(null, 204);
    }
}
