<?php

namespace App\Http\Controllers;

use App\Fortuneteller;
use App\Http\Resources\FortunetellerResource;
use App\Keyword;
use App\KeywordDetail;
use App\Shop;
use App\Area;
use App\Http\Resources\ShopResource;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;

class ShopController extends Controller
{
    const ITEM_PER_PAGE = 10;

    public function index(Request $request)
    {
        $params = $request->all();
        $list = Shop::select('*')->where('is_activated', true)->where('is_deleted', false);
        $limit = Arr::get($params, 'limit', static::ITEM_PER_PAGE);
        $keyword = Arr::get($params, 'keyword', '');
        $areaSlug = Arr::get($params, 'area', '');
        $orderBy = Arr::get($params, 'sorting', 'date');

        if (isset($keyword) && !empty($keyword)) {
            $checkFilterKeyword = [];
            $kItem = Keyword::where('is_activated', true)->where('is_deleted', false)->where('name', $keyword)->first();
            if(isset($kItem)) {
                $kDetail = KeywordDetail::select('id', 'ref_id', 'keyword_id')->where('type', 'shop')->where('keyword_id', $kItem->id)->get();
                foreach ($kDetail as $v) {
                    $checkFilterKeyword[] = $v->ref_id;
                }
            }

            $list->where(function ($query) use ($keyword, $checkFilterKeyword) {
                $query->where('name', 'like', "%$keyword%")
                    ->orWhere('slug', 'like', "%$keyword%")
                    ->orWhere('description', 'like', "%$keyword%")
                    ->orWhereIn('id', $checkFilterKeyword);
            });
        }

        if (isset($areaSlug) && $areaSlug != null && $areaSlug != "") {
            $areaItem = Area::where('is_activated', true)
                        ->where('is_deleted', false)
                        ->where('slug', $areaSlug)
                        ->first();
            $areaId = (isset($areaItem)) ? $areaItem->id : null;
            $listAreaIds = [];
            if ($areaId != null) {
                $listArea = Area::select('id', 'parent_id')->where('is_activated', true)->where('is_deleted', false)->where('id', '!=', $areaId)->where('parent_id', '!=', 0)->get();
                $listAreaIds = $this->getChildAreaId($listArea, $areaId);
            }
            $listAreaIds[] = $areaId;
            $list->whereIn('area_id', $listAreaIds);
        }

        if ($orderBy == 'date') {
            $list->orderBy('created_at', 'DESC');
        }

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

    private function getChildAreaId($list, $parentId) {
        $rs = [];
        foreach ($list as $item) {
            if ($item->parent_id == $parentId) {
                $rs[] = $item->id;
                $rsChild = $this->getChildAreaId($list, $item->id);
                $rs = array_merge($rs, $rsChild);
            }
        }
        return $rs;
    }

    public function topTeller(Request $request, $id = 0) {
        $params = $request->all();
        $limit = Arr::get($params, 'limit', 20);

        $list = Fortuneteller::select('id', 'number', 'slug', 'name', 'gender', 'cost', 'display_name', 'avatar', 'message', 'desc_1_full', 'created_at')
            ->where('is_activated', true)
            ->where('is_deleted', false)
            ->where('shop_id', $id)
            ->orderBy('updated_at', 'DESC');

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

    public function getByArea($area = '', Request $request) {
        $params = $request->all();
        $limit = Arr::get($params, 'limit', 15);
        $area = Area::where('is_activated', true)->where('is_deleted', false)->where('slug', $area)->first();
        if (!isset($area)) return response()->json(['data' => ['status' => 'error', 'message' => 'Shop is not found']], 203);
        $list = Shop::select('*')
            ->where('is_activated', true)
            ->where('is_deleted', false)
            ->where('area_id', $area->id)
            ->orderBy('created_at', 'ASC')
            ->paginate($limit);

        return ShopResource::collection($list);
    }

    public function show($id = 0, Request $request)
    {
        $shop = Shop::select('*')
            ->where('is_activated', true)
            ->where('is_deleted', false)
            ->where('id', $id)
            ->first();

        if (!isset($shop) && $request->has('preview') && $request->get('preview') !== "" && $request->get('preview') !== "null") {
            $shop = Shop::select('*')
                //->where('preview_code', $request->get('preview'))
                ->where('is_deleted', false)
                ->where('id', $id)
                ->first();
        }

        if (!isset($shop)) return response()->json(['data' => ['status' => 'error', 'message' => 'Shop is not found']], 200);

        return new ShopResource($shop);
    }

    public function search() {
        $shops = Shop::select('id', 'name', 'show_search')
            ->where('is_activated', true)
            ->where('is_deleted', false)
            ->orderBy('order')
            ->orderBy('id')
            ->get();

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