<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Order;
use App\Http\Resources\Admin\OrderResource;
use Validator;

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

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

        if (!empty($keyword)) {
            $keyword = str_replace("#", "", $keyword);
            $list->where('code', 'LIKE', '%' . $keyword . '%');
        }

        if ($status != '') {
            $list->where('status', $status);
        }

        $list->orderBy('id', 'DESC');

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

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

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

    public function allNested(Request $request)
    {
        $ignoreId = Arr::get($request->all(), 'ignoreId', '');
        $list = Order::select('*')->isPublished();

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

        $list = $list->orderBy('id', 'DESC')->get();

        $rs = $this->getChildItems($list, 0);

        return response()->json(['data' => $rs], 200);
    }

    public function getChildItems($list, $parent = 0)
    {
        $rs = [];
        foreach ($list as $item) {
            if ($item->parent_id == $parent) {
                $cate = ['value' => $item->id, 'label' => $item->name];
                $children = $this->getChildItems($list, $item->id);
                if ($children !== null && count($children) > 0) $cate['children'] = $children;
                $rs[] = $cate;
            }
        }

        return $rs;
    }

    public function available(Request $request)
    {

        $ignoreId = Arr::get($request->all(), 'ignoreId', '');
        $list = Order::select('id', 'name')->isPublished();

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

        $list->orderBy('id');

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

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

        return new OrderResource($order);
    }

    public function store(Request $request)
    {
        return response()->json(null, 204);
    }

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

        $order->update([
            'status'       => $params['status'],
            'is_activated' => false,
            'updated_at'   => date('Y-m-d H:i:s')
        ]);

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

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

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

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

    public function position(Request $request)
    {
        if (!$request->has('position')) return response()->json(['errors' => 'Data is invalid'], 403);
        $newIndexes = $request->position;
        if (is_array($newIndexes)) {
            foreach ($newIndexes as $item) {
                Order::where('id', $item['id'])->update(['position' => $item['order']]);
            }
        }

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