<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Header;
use App\Http\Resources\Admin\HeaderResource;
use Validator;

/**
 * Class HeaderController
 *
 * @package App\Http\Controllers
 */
class HeaderController extends Controller
{
    const ITEM_PER_PAGE = 20;
    private $_imagePath;

    public function __construct()
    {
        $this->_imagePath = public_path('uploads/image/header/');
    }

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

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

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

    public function all()
    {
        $list = Header::select('id', 'name', 'slug')->notDeleted()->orderBy('id');

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

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

        return new HeaderResource($header);
    }

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), ['uri' => ['required'], 'title' => ['required'], 'is_activated' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $params = $request->all();
        $uri = trim("/" . $params['uri']);
        $uri = str_replace("/ ", "/", $uri);
        $uri = str_replace(" / ", "/", $uri);
        $uri = str_replace(" /", "/", $uri);
        $uri = str_replace(" ", "-", $uri);
        $uri = str_replace("//", "/", $uri);
        $uri = str_replace("&&", "&", $uri);
        $uri = str_replace("/?", "?", $uri);
        $uri = str_replace("?/", "?", $uri);
        $uri = str_replace("??", "?", $uri);
        $uri = str_replace("?&", "?", $uri);
        $uri = preg_replace('/(?:&|(\?))page=[^&]*(?(1)&|)?/i', "$1", $uri);
        if (strlen($uri) > 1 && $uri[strlen($uri) - 1] == "/") $uri = substr($uri, 0, -1);

        $query = [];
        if (strpos($uri, "?") !== false) {
            $queryStr = explode("?", $uri);
            if (isset($queryStr[1]) && $queryStr[1] != "") {
                $queryArr = explode("&", $queryStr[1]);
                foreach ($queryArr as $qIt) {
                    $qItem = explode("=", $qIt);
                    $query[$qItem[0]] = $qItem[1];
                }
            }
        }

        if (count($query) > 0) {
            foreach ($query as $k => $q) {
                if ($k == 'keyword') {
                    $uri = str_replace("&keyword=" . $q, "", $uri);        
                    /*$uri = str_replace("&keyword=" . $q, "&keyword=*", $uri);*/
                } else {
                    if ($q == null || $q == "") {
                        $uri = str_replace("&" . $k . "=" . $q, "", $uri);   
                    }
                }
            }    
        }
        $uri = preg_replace('/(?:&|(\?))keyword=[^&]*(?(1)&|)?/i', "$1", $uri);

        $headerExist = Header::where('uri', $uri)->first();
        if (isset($headerExist)) return response()->json(['errors' => 'Uri is exist'], 403);

        $header = Header::create([
            'uri'          => $uri,
            'title'        => $params['title'],
            'image'        => $params['image'],
            'color'        => $params['color'],
            'type'         => ($params['type'] === true) ? 1 : 0,
            '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')
        ]);

        return new HeaderResource($header);
    }

    public function update($id = 0, Request $request)
    {
        $validator = Validator::make($request->all(), ['uri' => ['required'], 'title' => ['required'], 'is_activated' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $header = Header::notDeleted()->where('id', $id)->first();
        if (!isset($header)) return response()->json(['errors' => 'Header is not valid'], 403);
        $params = $request->all();
        $uri = trim("/" . $params['uri']);
        $uri = str_replace("/ ", "/", $uri);
        $uri = str_replace(" / ", "/", $uri);
        $uri = str_replace(" /", "/", $uri);
        $uri = str_replace(" ", "-", $uri);
        $uri = str_replace("//", "/", $uri);
        $uri = str_replace("&&", "&", $uri);
        $uri = str_replace("/?", "?", $uri);
        $uri = str_replace("?/", "?", $uri);
        $uri = str_replace("??", "?", $uri);
        $uri = str_replace("?&", "?", $uri);
        $uri = preg_replace('/(?:&|(\?))page=[^&]*(?(1)&|)?/i', "$1", $uri);
        if (strlen($uri) > 1 && $uri[strlen($uri) - 1] == "/") $uri = substr($uri, 0, -1);

        $query = [];
        if (strpos($uri, "?") !== false) {
            $queryStr = explode("?", $uri);
            if (isset($queryStr[1]) && $queryStr[1] != "") {
                $queryArr = explode("&", $queryStr[1]);
                foreach ($queryArr as $qIt) {
                    $qItem = explode("=", $qIt);
                    $query[$qItem[0]] = $qItem[1];
                }
            }
        }

        if (count($query) > 0) {
            foreach ($query as $k => $q) {
                if ($k == 'keyword') {
                    $uri = str_replace("&keyword=" . $q, "", $uri);        
                    //$uri = str_replace("&keyword=" . $q, "&keyword=*", $uri);        
                } else {
                    if ($q == null || $q == "") {
                        $uri = str_replace("&" . $k . "=" . $q, "", $uri);   
                    }
                }
            }    
        }
        $uri = preg_replace('/(?:&|(\?))keyword=[^&]*(?(1)&|)?/i', "$1", $uri);

        $headerExist = Header::where('id', '!=', $id)->where('uri', $uri)->first();
        if (isset($headerExist)) return response()->json(['errors' => 'Uri is exist'], 403);

        $header->update([
            'uri'          => $uri,
            'title'        => $params['title'],
            'image'        => $params['image'],
            'color'        => $params['color'],
            'type'         => ($params['type'] === true) ? 1 : 0,
            'is_activated' => ($params['is_activated'] === true) ? 1 : 0,
            'updated_at'   => date('Y-m-d H:i:s')
        ]);

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

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

        try {
            $header->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', []);
        $headerList = Header::notDeleted()->whereIn('id', $listIds)->get();
        if ($headerList->count() <= 0) response()->json(['error' => 'Header is not valid.'], 403);
        try {
            Header::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', []);
        $headerList = Header::notDeleted()->whereIn('id', $listIds)->get();
        if ($headerList->count() <= 0) response()->json(['error' => 'Header is not valid.'], 403);
        try {
            Header::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', []);
        $headerList = Header::notDeleted()->whereIn('id', $listIds)->get();
        if ($headerList->count() <= 0) response()->json(['error' => 'Header is not valid.'], 403);
        try {
            Header::notDeleted()->whereIn('id', $listIds)->update(['is_activated' => false]);
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

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

    public function uploadImage(Request $request)
    {
        if ($request->hasFile('image')) {
            $file = $request->file('image');
            $baseName = $file->getClientOriginalName();
            $fileName = md5($baseName . rand(1111, 9999) . date('YmdHis')) . '.' . $file->getClientOriginalExtension();
            $file->move($this->_imagePath, $fileName);
            return response()->json(['status' => 'success', 'message' => 'Upload Success.', 'file_name' => $fileName, 'baseName' => $baseName], 200);
        }

        return response()->json(['status' => 'error', 'message' => 'Upload Fail.', 'file_name' => null], 403);
    }

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

        $uri = '';
        if ($id != "" && $name == 'shop') $uri = "/shop/detail/" . $id;
        if ($uri == "" && $uri == null) return response()->json(['status' => 'not_exist', 'message' => 'Header is not exist.', 'id' => null], 200);

        $header = Header::select('id', 'uri')->notDeleted()->where('uri', $uri)->first();
        if (!isset($header) || $header->id == null) return response()->json(['status' => 'not_exist', 'message' => 'Header is not exist.', 'id' => null], 200);

        return response()->json(['status' => 'success', 'message' => 'Header is valid.', 'id' => $header->id], 200);
    }
    
}
