<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Requests\Api\MapItemIndex;
use App\Http\Requests\Api\MapItemInfoFiltersRequest;
use App\Http\Requests\Api\MapItemInfoRequest;
use App\Http\Requests\Api\MapItemPdfRequest;
use App\Http\Resources\MapInfoFiltersResource;
use App\Http\Resources\MapItemListResource;
use App\Http\Resources\MapItemResource;
use App\Libs\Services\MapItemService;
use App\Models\GenericBackoffice\Entry;
use Barryvdh\DomPDF\Facade\Pdf;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Resources\Json\JsonResource;

class MapItemController extends Controller
{
    protected MapItemService $MapItemService;

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

    /**
     * Display the specified resource.
     *
     * @param MapItemIndex $request
     * @return JsonResource|JsonResponse
     */
    public function index()
    {
        $mapItems = $this->MapItemService->list();

        if ($mapItems) {
            return MapItemListResource::collection($mapItems);
        }
        return response()->json([], 404);
    }

    public function getMapInfoByMapItemId(MapItemInfoRequest $request)
    {
        $data = $request->validated();
        $MapItem = $this->MapItemService->findByMapItemId($data);

        if ($MapItem) {
            return new MapItemResource($MapItem);
        }

        return response()->json(null, 404);
    }

    /**
     * Generate a PDF with Map Item information
     *
     * @param MapItemPdfRequest $request
     * @return \Illuminate\Http\Response
     */
    public function generatePdf(MapItemPdfRequest $request)
    {
        $data = $request->validated();

        // Find the map item with all its map information records
        $mapItem = $this->MapItemService->findByMapItemIdWithAllMapInformation($data['countryId']);

        if (!$mapItem) {
            return response()->json(['error' => 'Map item not found'], 404);
        }

        $fileName = strtolower(str_replace(' ', '_', $mapItem->title)) . '_map_information.pdf';

        $page = Entry::full()
            ->select('*')
            ->where('status', 'published')
            ->where('lang_slug', $data['slug'])
            ->orderBy('position', 'asc')
            ->first();

        $pdf = PDF::loadView('pdf.map-item', [
            'mapItem' => $mapItem,
            'mapInformations' => $mapItem->mapInformations,
            'disclaimer' => $page ? $page->content : '',
        ]);

        return $pdf->download($fileName);
    }

    public function getMapInfoFilters(MapItemInfoFiltersRequest $request)
    {
        $data = $request->validated();
        $filters = $this->MapItemService->getMapInfoFilters($data);

        if ($filters) {
            return new MapInfoFiltersResource($filters);
        }

        return response()->json([], 404);
    }
}
