<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Requests\Api\BaseShow;
use App\Http\Requests\Api\FileUpload;
use App\Libs\Services\FileService;
use App\Services\PdfWatermarkService;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;

class FileController extends Controller
{
    public function uploadFile(FileUpload $request, FileService $fileService)
    {
        $data = $request->validated();
        $tempFileName = $fileService->storeFile($data);

        if (empty($tempFileName)) {
            return response()->json([], 404);
        }

        return response()->json(['fileName' => $tempFileName]);
    }

    public function downloadFile(BaseShow $request, FileService $fileService)
    {
        $data = $request->validated();

        $document = $fileService->findDocumentFile($data['slug']);

        if (empty($document)) {
            return response()->json([], 404);
        }

        $filepath = config('path.private.media') . '/' . $document->documentFile->filename;

        if (!Storage::has($filepath)) {
            return response()->json([], 404);
        }

        $userData = Auth::user();

        if(empty($userData)) {
            return response()->json([], 401);
        }

        switch ($document->committee->type) {
            case 'legalCommittee':
                if (!$userData->member->legal_committee) {
                    return response()->json([], 401);
                }
                break;
            case 'legalOpinions':
                $hasPermission = $userData->member->user_permission_level
                    ? $userData->legal_opinion_permission
                    : $userData->member->legal_opinions;

                if (!$hasPermission) {
                    return response()->json([], 401);
                }
                break;
            case 'financeSubCommittee':
                $hasFinanceSubCommitteePermission = $userData->finance_sub_committee_permission;

                if (!$hasFinanceSubCommitteePermission) {
                    return response()->json([], 401);
                }
                break;
        }

        // Apply watermark for Legal Opinions PDFs
        if (
            $document->committee->type === 'legalOpinions'
            && strtolower($document->documentFile->extension) === 'pdf'
        ) {
            $userName = trim(($userData->name ?? '') . ' ' . ($userData->last_name ?? ''));
            $companyName = $userData->member->name ?? 'Unknown';
            $dateTime = now()->format('d/m/Y H:i:s');

            $watermarkService = new PdfWatermarkService();
            $watermarkedPath = $watermarkService->apply($filepath, $userName, $companyName, $dateTime);

            if ($watermarkedPath) {
                return response()->download(
                    $watermarkedPath,
                    $document->documentFile->original_filename
                )->deleteFileAfterSend(true);
            }

            // Fallback: if watermark failed, download the original
            Log::info('PdfWatermarkService: Serving original PDF without watermark.', [
                'document_id' => $document->id,
                'user_id' => $userData->id,
            ]);
        }

        return Storage::download($filepath, $document->documentFile->original_filename);
    }
}
