<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Requests\Api\SearchAutocompleteRequest;
use App\Http\Requests\Api\SearchRequest;
use App\Http\Resources\SearchResource;
use App\Libs\Services\SearchService;
use App\Models\Document;
use Illuminate\Database\Eloquent\Relations\MorphTo;
use Illuminate\Support\Facades\DB;

class SearchController extends Controller
{
    protected SearchService $searchService;

    public function __construct(SearchService $searchService)
    {
        $this->searchService = $searchService;
    }

    public function search(SearchRequest $request)
    {
        $data = $request->validated();
        $lang = getActiveLanguage();
        $perPage = $data['perPage'] ?? 50;
        $page = 1;

        $query = $data['q'];

        if (empty($query)) {
            return [
                'searchParam' => '',
                'data' => [],
            ];
        }

        $filters = [];

        if (!empty($data['dateStart'])) {
            $filters['dateStart'] = $data['dateStart'];
        }

        if (!empty($data['dateEnd'])) {
            $filters['dateEnd'] = $data['dateEnd'];
        }

        // DB::enableQueryLog();

        $results = $this->searchService->search($query, $lang, $page, $perPage, $filters);
        $results->load(['objectable' => function (MorphTo $morphTo) {
            $morphTo->morphWith([
                Document::class => [
                    'committee' => function($query) {
                        $query->full()->where('status', 'published');
                    },
                    'country' => function($query) {
                        $query->full()->with('flag');
                    },
                    'documentFile',
                    'tags' => function($query) {
                        $query->full()->select('*');
                    }
                ],
            ]);
        }]);

        // dd(DB::getQueryLog());

        // $paginationData = [
        //     'currentPage' =>  intval($results->currentPage()),
        //     'lastPage' => intval($results->lastPage()),
        //     'perPage' =>  intval($results->perPage()),
        //     'total' =>  intval($results->total()),
        //     'count' =>  intval($results->count()),
        //     'hasMorePages' => $results->hasMorePages(),
        //     'nextPageUrl' => $results->nextPageUrl(),
        //     'prevPageUrl' => $results->previousPageUrl(),
        // ];

        return response()->json(
            [
                'searchParam' => $query,
                'data' => SearchResource::collection($results, $query),
                // 'pagination' => $paginationData,
            ],
            200
        );
    }

    public function searchAutocomplete(SearchAutocompleteRequest $request)
    {
        $data = $request->validated();
        $lang = getActiveLanguage();
        $perPage = 10;

        $query = $data['q'];

        if (empty($query)) {
            return [
                'searchParam' => '',
                'data' => [],
            ];
        }

        // DB::enableQueryLog();

        $results = $this->searchService->searchAutoComplete($query, $lang, $perPage);
        $results->load(['objectable' => function (MorphTo $morphTo) {
            $morphTo->morphWith([
                Document::class => [
                    'committee' => function($query) {
                        $query->full()->where('status', 'published');
                    },
                    'country' => function($query) {
                        $query->full()->with('flag');
                    },
                    'documentFile',
                    'tags' => function($query) {
                        $query->full()->select('*');
                    }
                ],
            ]);
        }]);

        // dd(DB::getQueryLog());

        return response()->json(
            [
                'searchParam' => $query,
                'data' => SearchResource::collection($results, $query),
            ],
            200
        );
    }
}
