<?php

namespace App\Http\Controllers\Frontend;

use App\Exceptions\ApiHttpException;
use App\Facades\CompetitionsService;
use App\Http\Controllers\Controller;
use App\Http\Requests\CompetitionListRequest;
use App\Http\Resources\Competitions\CompetitionDetailResource;
use App\Http\Resources\Competitions\CompetitionResourceCollection;
use Illuminate\Support\Facades\Auth;

class CompetitionsController extends Controller
{
    public function index(CompetitionListRequest $request)
    {
        $user = Auth::user();

        $data = $request->validated();

        $competitions = CompetitionsService::getCompetitions($data, $user);

        return new CompetitionResourceCollection($competitions, CompetitionsService::getFiltersCount($data));
    }

    public function show(string $slug)
    {
        $user = Auth::user();

        $competition = CompetitionsService::getCompetitionBySlug($slug, $user);

        if (!$competition) {
            throw new ApiHttpException(404, 'item_not_found');
        }

        return new CompetitionDetailResource($competition);
    }

    public function getFiltersCount(CompetitionListRequest $request)
    {
        $data = $request->validated();

        $counts = CompetitionsService::getFiltersCount($data);

        return response()->json($counts);
    }

    public function downloadDocument(int $mediaItemId)
    {
        $user = Auth::user();

        $mediaItem = CompetitionsService::getCompetitionDocument($mediaItemId, $user);

        if (!$mediaItem) {
            throw new ApiHttpException(404, 'item_not_found');
        }

        $filename = $mediaItem->original_filename ?: $mediaItem->filename;
        $fileExtension = strtolower(pathinfo($filename, PATHINFO_EXTENSION) ?: $mediaItem->extension ?: '');

        $contentTypes = [
            'pdf' => 'application/pdf',
            'doc' => 'application/msword',
            'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'xls' => 'application/vnd.ms-excel',
            'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'csv' => 'text/csv',
            'txt' => 'text/plain',
            'zip' => 'application/zip',
        ];
        $filePath = storage_path('app/public/uploads/' . $mediaItem->base_folder . '/' . $mediaItem->path);

        if (!file_exists($filePath)) {
            throw new ApiHttpException(404, 'document_not_found');
        }

        $contentType = mime_content_type($filePath) ?: ($contentTypes[$fileExtension] ?? 'application/octet-stream');

        return response()->download($filePath, $filename, [
            'Content-Type' => $contentType,
            'X-Content-Type-Options' => 'nosniff',
        ]);
    }
}
