<?php

namespace App\Http\Controllers\Api;

use App\Http\Resources\StoresCollection;
use App\Http\Resources\Stores as StoreResource;
use App\Models\Store;
use App\Http\Requests\Api\BaseShow;
use App\Http\Controllers\Controller;
use App\Http\Requests\Api\StoresIndex;

class StoreController extends Controller
{
    /**
     * Display a listing of the resource.
     * @param  StoresIndex $request
     * @return StoresCollection
     */
    public function index(StoresIndex $request)
    {
        $data = $request->validated();
        $encrypter = getEncrypter(config("app.lists_key"));
        $pageKey = isset($data['pagekey']) ? $data['pagekey'] : NULL;
        $pastStores = isset($data['paststores']) ? $data['paststores'] : FALSE;

        $orderFieldName = 'id';
        $orderByDirection = 'desc';
        $orderDirection = '<';
        $reverseOrder = FALSE;
        $reverse = FALSE;
        $nextKeyValue = FALSE;

        if ($pastStores) {
            // Get past events from today date
            $orderByDirection = 'desc';
            $orderDirection = '<';
            $reverse = isset($data['reverse']) ? $data['reverse'] : FALSE;
            if ($reverse) {
                $orderByDirection = 'asc';

                if ($pageKey) {
                    $reverseOrder = TRUE;
                }
            }
        }

        $pageSize = 4;

        $query = Store::full()
            ->select(
                'id',
                'language_id',
                'title',
                'description',
                'link',
                'lang_slug'
            )
            ->orderBy($orderFieldName, $orderByDirection);

        if ($pageKey) {
            addNextKeyToQuery($encrypter, $query, $pageKey, $orderFieldName, $orderDirection, 'id', $reverseOrder);
        }

        $query->limit($pageSize + 1); // Check if more pages exist

        // Fetch the query
        $stores = $query->get();

        if ($stores->count() > $pageSize) {
            $stores->pop();
            $hasNextPage = TRUE;
        } else {
            $hasNextPage = FALSE;
        }

        if (!$stores->isEmpty() && $hasNextPage) {
            $nextKeyValue = getNextKeyValue($encrypter, $stores, $orderFieldName, 'id');
        }

        return new StoresCollection($stores, $nextKeyValue);
    }

    /**
     * Display the specified resource.
     *
     * @param  BaseShow $request
     * @return StoreResource
     */
    public function show(BaseShow $request)
    {
        // Retrieve the validated input data...
        $data = $request->validated();

        $store = Store::full()
            ->select(
                'id',
                'language_id',
                'title',
                'description',
                'link',
                'lang_slug'
            )
            ->where('lang_slug', $data['slug'])
            ->first();

        return new StoreResource($store);
    }
}
