<?php

namespace App\Http\Controllers\Api\V1;

use App\Http\Controllers\Api\V1\ApiController;
use App\Services\AddDataService;
use App\Services\MenuDataService;
use App\Services\PageDataService;
use Throwable;
use App\Services\ExhibitionDataService;
use App\Services\NewsItemDataService;
use App\Http\Resources\V1\AppEntryContentResource;
use App\Libs\Services\FcmService;
use App\Models\Add;
use App\Services\CollectionDataService;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
use App\Http\Resources\V1\AppStructureResource;
use App\Http\Requests\V1\EntryContentRequest;
use App\Libs\Api\ParsedListParams;
use App\Services\LoginScreenDataService;
use App\Services\OnboardingDataService;
use Illuminate\Support\Facades\Log;

class StructureController extends ApiController
{

    /**
     * Class constructor
     *
     * @return void
     */
    public function __construct()
    {
    }

    /**
     * Gets a structure of information required for the App
     * GET api/v1/structure
     * 
     * @return AppStructureResource
     */
    public function index(FcmService $fcmService): AppStructureResource
    {

        try {
            $menuDs = new MenuDataService();
            $menu = $menuDs->findFirst();
        } catch (Throwable $e) {
            Log::error($e);
            $menu = [];
        }

        $addsDs       = new AddDataService();
        $pagesDs      = new PageDataService();
        $onboardingDs = new OnboardingDataService();
        $allAdds      = $addsDs->list();
        $adds         = $allAdds->filter(function ($item, $key) {
            return $item->entry_screen != 1;
        });
        $loginAdd     = $this->getLoginAdd($allAdds);
        $splashAdd    = LoginScreenDataService::getActiveScreen();
        $onboardings  = $onboardingDs->list();



        $data = [
            'menu'         => $menu,
            'languages'    => $this->getLanguagesStructure(),
            'topics'       => $fcmService->getFcmTopics(),
            'pages'        => $pagesDs->list(),
            'adds'         => $adds,
            'splash_ad'    => $loginAdd,
            'login_splash' => $splashAdd,
            'onboarding'   => $onboardings,
        ];

        return new AppStructureResource($data);
    }

    /**
     * Gets the entry screen contents for the app
     * GET api/v1/entry_contents
     * 
     * @return AppEntryContentResource
     */
    public function entryContents(
        EntryContentRequest $request,
        ExhibitionDataService $exhibitionDs,
        CollectionDataService $collectionDataService,
        AddDataService $addDataservice,
        NewsItemDataService $newsDs
    ): AppEntryContentResource {

        $requestData       = $request->validated();
        $parsedListParams  = new ParsedListParams($requestData);


        $data = [
            'exhibitions' => $exhibitionDs->getEntryScreenExhibitions($parsedListParams),
            'news'        => $newsDs->getEntryScreenNews(),
            'collections' => $collectionDataService->getEntryScreenCollections($parsedListParams),
            'ads'         => $addDataservice->getEentryScreenAds(),
        ];

        return new AppEntryContentResource($data);
    }


    /**
     * Gets the login screen add, if any
     */
    private function getLoginAdd($adds): ?Add
    {
        foreach ($adds as $add) {
            if ($add->entry_screen) {
                return $add;
            }
        }

        return null;
    }


    private function getLanguagesStructure(): array
    {
        $availableLangs = LaravelLocalization::getSupportedLocales();
        $langs = [];
        foreach ($availableLangs as $code => $lang) {
            $langs[] = [
                'locale' => $code,
                'name'   => ucfirst($lang['native']),
                'default' => $code === 'pt' ? true : false,
                'strings' =>  trans('apiStrings', [], $code),
            ];
        }


        return $langs;
    }
}
