<?php

namespace App\Http\Controllers\Admin;

use App\Brand;
use App\BrandDetail;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Seo;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Store;
use App\Http\Resources\Admin\StoreResource;
use Validator;

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

    public function index(Request $request)
    {
        $searchParams = $request->all();
        $list = Store::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('name', 'LIKE', '%' . $keyword . '%');
        }
        if ($status != '') {
            $list->where('is_activated', $status);
        }
        $list->orderBy('id', 'ASC');

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

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

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

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

        return new StoreResource($store);
    }

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

        $checkStore = Store::where('name', $params['name'])
            ->where('area_id', $params['area_id'])
            ->where('phone_number', $params['phone_number'])
            ->where('address', $params['address'])
            ->where('is_activated', true)
            ->where('is_deleted', false)
            ->first();
        if (isset($checkStore) && $checkStore->id != null) return response()->json(['data' => ['status' => 'error', 'message' => 'Store already exists.']], 200);

        $store = Store::create([
            'package_id'    => $params['package_id'],
            'area_id'       => $params['area_id'],
            'station_id'    => $params['station_id'],
            'name'          => $params['name'],
            'address'       => $params['address'],
            'phone_number'  => $params['phone_number'],
            'email'         => $params['email'],
            'title'         => $params['title'],
            'slug'          => Helper::slug($params['slug']),
            'description'   => $params['description'],
            'other_request' => $params['other_request'],
            'open_time'     => $params['open_time'],
            'working_time'  => $params['working_time'],
            'latitude'      => $params['latitude'],
            'longitude'     => $params['longitude'],
            'near'          => $params['near'],
            'rating'        => number_format($params['rating'], 2),
            'thumbnail'     => $params['thumbnail'],
            'website'       => $params['website'],
            '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')
        ]);

        BrandDetail::where('store_id', $store->id)->delete();
        if (isset($params['brand']) && $params['brand'] != null && is_array($params['brand'])) {
            $brandInsert = [];
            foreach ($params['brand'] as $it) {
                $brandInsert[] = [
                    'store_id'   => $store->id,
                    'brand_id'   => $it,
                    'created_at' => date('Y-m-d H:i:s'),
                    'updated_at' => date('Y-m-d H:i:s')
                ];
            }
            if (count($brandInsert) > 0) BrandDetail::insert($brandInsert);
        }

        $uri = '/store/' . $store->id . '/' . $store->slug;
        Seo::where('type', 'store')->where('post_id', $store->id)->delete();
        Seo::create([
            'uri'         => $uri,
            'title'       => $params['seo']['title'],
            'robots'      => $params['seo']['robots'],
            'keywords'    => $params['seo']['keywords'],
            'description' => $params['seo']['description'],
            'image'       => $params['thumbnail'],
            'type'        => 'store',
            'post_id'     => $store->id,
            'is_amp'      => ($params['seo']['is_amp'] === true || $params['seo']['is_amp'] === 'true') ? 1 : 0,
            'created_at'  => date('Y-m-d H:i:s'),
            'updated_at'  => date('Y-m-d H:i:s')
        ]);

        return new StoreResource($store);
    }

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

        $params = $request->all();
        $checkStore = Store::where('name', $params['name'])
            ->where('area_id', $params['area_id'])
            ->where('phone_number', $params['phone_number'])
            ->where('address', $params['address'])
            ->where('is_activated', true)
            ->where('is_deleted', false)
            ->where('id', '!=', $store->id)
            ->first();
        if (isset($checkStore) && $checkStore->id != null) return response()->json(['data' => ['status' => 'error', 'message' => 'Store already exists.']], 200);

        $store->update([
            'package_id'    => $params['package_id'],
            'area_id'       => $params['area_id'],
            'station_id'    => $params['station_id'],
            'name'          => $params['name'],
            'address'       => $params['address'],
            'phone_number'  => $params['phone_number'],
            'email'         => $params['email'],
            'title'         => $params['title'],
            'slug'          => Helper::slug($params['slug']),
            'description'   => $params['description'],
            'other_request' => $params['other_request'],
            'open_time'     => $params['open_time'],
            'working_time'  => $params['working_time'],
            'latitude'      => $params['latitude'],
            'longitude'     => $params['longitude'],
            'near'          => $params['near'],
            'rating'        => number_format($params['rating'], 2),
            'thumbnail'     => $params['thumbnail'],
            'website'       => $params['website'],
            'is_activated'  => ($params['is_activated'] === true) ? 1 : 0,
            'updated_at'    => date('Y-m-d H:i:s')
        ]);

        BrandDetail::where('store_id', $store->id)->delete();
        if (isset($params['brand']) && $params['brand'] != null && is_array($params['brand'])) {
            $brandInsert = [];
            foreach ($params['brand'] as $it) {
                $brandInsert[] = [
                    'store_id'   => $store->id,
                    'brand_id'   => $it,
                    'created_at' => date('Y-m-d H:i:s'),
                    'updated_at' => date('Y-m-d H:i:s')
                ];
            }
            if (count($brandInsert) > 0) BrandDetail::insert($brandInsert);
        }

        $uri = '/store/' . $store->id . '/' . $store->slug;
        $checkSeo = Seo::where('type', 'store')->where('post_id', $store->id)->first();
        $seoData = [
            'uri'         => $uri,
            'title'       => $params['seo']['title'],
            'robots'      => $params['seo']['robots'],
            'keywords'    => $params['seo']['keywords'],
            'description' => $params['seo']['description'],
            'image'       => $params['thumbnail'],
            'type'        => 'store',
            'post_id'     => $store->id,
            'is_amp'      => ($params['seo']['is_amp'] === true || $params['seo']['is_amp'] === 'true') ? 1 : 0,
            'updated_at'  => date('Y-m-d H:i:s')
        ];

        if (!isset($checkSeo)) {
            $seoData['created_at'] = date('Y-m-d H:i:s');
            Seo::create($seoData);
        } else {
            $checkSeo->update($seoData);
        }

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

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

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

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