<?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 App\Models\FileCard;
use App\Models\PressRelease;
use Illuminate\Database\Eloquent\Relations\MorphTo;

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'] ?? 7;
        $page = $data['page'] ?? 1;

        $query = $data['q'];

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

        $filters = [];

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

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

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

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

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

        $orderDir = !empty($data['orderDir']) ? $data['orderDir'] : 'asc';

        $orderBy = '';
        if (!empty($data['orderBy'])) {
            switch ($data['orderBy']) {
                case 'alphabetical':
                    $orderBy = 'alphabetical';
                    break;

                case 'date':
                    $orderBy = 'date';
                    break;
            }
        }

        // DB::enableQueryLog();

        $results = $this->searchService->search($query, $data['contentType'], $lang, $page, $perPage, $orderDir, $orderBy, $filters);

        switch ($data['contentType']) {
            case 'document':
                $results->load(['objectable' => function (MorphTo $morphTo) {
                    $morphTo->morphWith([
                        Document::class => [
                            'topics' => function($query) {
                                $query->full();
                            },
                            'documentType' => function($query) {
                                $query->full();
                            },
                            'country' => function($query) {
                                $query->full()->with('flag');
                            },
                            'image',
                            'documentFile',
                            'tags' => function($query) {
                                $query->full()->select('*');
                            }
                        ],
                        FileCard::class => [
                            'document',
                        ]
                    ]);
                }]);
                break;

            case 'press':
                $results->load(['objectable' => function (MorphTo $morphTo) {
                    $morphTo->morphWith([
                        PressRelease::class => [
                            'topic' => function($query) {
                                $query->full();
                            },
                            'country' => function($query) {
                                $query->full()->with('flag');
                            },
                            'image',
                            'imageMobile',
                            'document',
                            'tags' => function($query) {
                                $query->full()->select('*');
                            }
                        ],
                    ]);
                }]);
                break;
        }

        // 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 => [
                    'topics' => function($query) {
                        $query->full();
                    },
                    'documentType' => function($query) {
                        $query->full();
                    },
                    'country' => function($query) {
                        $query->full()->with('flag');
                    },
                    'image',
                    'documentFile',
                    'tags' => function($query) {
                        $query->full()->select('*');
                    }
                ],
            ]);
        }]);

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

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