<?php

namespace App\Modules\Miscellaneous\State;

use App\Models\State;

use App\Traits\CustomPaginationTrait;
use App\Http\Resources\Miscellaneous\State\StateCityCollection;

class StateCityModule
{
    /** Traits */
    use CustomPaginationTrait;

    /**
     * Fetch Items
     * 
     * @param array $data 
     * 
     * @return array 
     */
    public function fetchItems (array $data) : StateCityCollection
    {
        $items      =       State::query()
                                ->select('id', 'city')
                                ->groupBy('city')
                                ->when(
                                    isset($data['state']), 
                                    function ($query) use ($data)
                                    {
                                        $query->where('name', '=', $data['state']);
                                    }
                                )
                                ->when(
                                    isset($data['search']), 
                                    function ($query) use ($data)
                                    {
                                        $search = "%{$data['search']}%";
                                        
                                        $query->where('city', 'LIKE', $search);
                                    }
                                )
                                ->get();

        //! Hacky way of sorting 
        //! Reference : https://laracasts.com/discuss/channels/laravel/remove-keys-from-collection
        if (isset($data['sortBy']) && isset($data['sortOrder'])) 
        {
            $field      =   $data['sortBy'];
            $direction  =   $data['sortOrder'] == 'ascend' ? 'asc' : 'desc';

            $items = $items->sortBy(
                callback: function ($query) use ($field) 
                {
                    switch ($field) 
                    {
                        case "city":
                            return $query->city;
                            break;
                    }
                },
                descending: $direction == 'desc' ? true : false
            );
        }

        $items = $this->customPaginate(
            items: $items,
            currentPage: $data['currentPage'] ?? 1,
            sizePerPage: $data['sizePerPage'] ?? 20
        );

        return new StateCityCollection($items);
    }

    /**
     * Fetch Items By State 
     * 
     * @param string $state 
     * 
     * @return array 
     */
    public function fetchItemsByState (string $state) : array 
    {
        $items      =       State::query() 
                                ->where('name', '=', $state)
                                ->groupBy('city')
                                ->pluck('city')
                                ->toArray();

        return $items; 
    }
}
