<?php

namespace App\Http\Controllers;

use App\Http\Requests\LetterShow;
use App\Http\Requests\RatificationLetterForm;
use App\Http\Requests\RatificationLetterIndex;
use App\Http\Requests\RatificationLetterPartyIndex;
use App\Http\Requests\RatificationLetterUpdate;
use App\Http\Requests\RatificationLetterUpdateStatus;
use App\Http\Resources\RatificationLetterListResource;
use App\Http\Resources\RatificationLetterResource;
use App\Libs\Services\RatificationLetterService;
use App\Models\Letter;
use App\Models\RatificationLetter;

class RatificationLetterController extends Controller
{
    public function getRatificationLetters(RatificationLetterIndex $request, RatificationLetterService $ratificationLetterService)
    {
        $data = $request->validated();
        $ratificationLetters = $ratificationLetterService->getRatificationLetters($data);

        if (!empty($data['countOnly']) && $data['countOnly']) {
            return [
                'count' => $ratificationLetters['count']
            ];
        } elseif ($ratificationLetters) {
            return [
                'data' => RatificationLetterListResource::collection($ratificationLetters['ratificationLetters']),
                'pagination' => $ratificationLetters['pagination'],
            ];
        }
        return response()->json([], 404);
    }

    public function createRatificationLetter(RatificationLetterForm $request, RatificationLetterService $ratificationLetterService)
    {
        $data = $request->validated();

        $letter = Letter::find($data['letterId']);
        if (empty($letter)) {
            return response(['message' => 'Letter not found'], 404);
        }

        if ($letter->open_until < now()) {
            return response(['message' => 'Letter closed'], 404);
        }

        $existingRatificationLetter = RatificationLetter::where('letter_id', $data['letterId'])
            ->where(function ($query) use ($data) {
                if (!empty($data['legalEntityId'])) {
                    $query->where('legal_entity_id', $data['legalEntityId']);
                } else {
                    $query->where('company_id', $data['companyId'])
                    ->where(function ($query) {
                        $query->whereNull('legal_entity_id')
                          ->orWhere('legal_entity_id', 0);
                    });
                }
            })
            ->whereIn('status', ['pending', 'approved'])
            ->first();

        if ($existingRatificationLetter) {
            return response(['message' => 'Ratification letter already exists, you cannot upload another one.'], 403);
        }

        $ratificationLetter = $ratificationLetterService->createRatificationLetter($data);

        if (empty($ratificationLetter)) {
            return response(['message' => 'Ratification Letter could not be created'], 500);
        }

        return new RatificationLetterResource($ratificationLetter);
    }

    public function getRatificationLetter(LetterShow $request, RatificationLetterService $ratificationLetterService) {
        $data = $request->validated();
        $ratificationLetter = $ratificationLetterService->readRatificationLetter($data['id']);

        if (empty($ratificationLetter)) {
            return response(['error' => 'Error'], 401);
        }

        return new RatificationLetterResource($ratificationLetter);
    }

    public function updateRatificationLetter(RatificationLetterUpdate $request, RatificationLetterService $ratificationLetterService) {
        $data = $request->validated();
        $ratificationLetter = $ratificationLetterService->updateRatificationLetter($data);

        if (empty($ratificationLetter)) {
            return response(['error' => 'Error'], 401);
        }

        return new RatificationLetterResource($ratificationLetter);
    }

    public function deleteRatificationLetter(LetterShow $request, RatificationLetterService $ratificationLetterService) {
        $data = $request->validated();
        $response = $ratificationLetterService->deleteratificationLetter($data['id']);
        return $response;
    }

    public function getRatificationLettersParty(RatificationLetterPartyIndex $request, RatificationLetterService $ratificationLetterService) {
        $data = $request->validated();
        $ratificationLetters = $ratificationLetterService->getRatificationLettersParty($data);

        if ($ratificationLetters) {
            return [
                'data' => RatificationLetterListResource::collection($ratificationLetters['ratificationLetters']),
                'pagination' => $ratificationLetters['pagination'],
            ];
        }
        return response()->json([], 404);
    }

    public function updateRatificationLetterStatus(RatificationLetterUpdateStatus $request, RatificationLetterService $ratificationLetterService) {
        $data = $request->validated();
        $ratificationLetter = $ratificationLetterService->updateRatificationLetterStatus($data);

        if ($ratificationLetter) {
            return new RatificationLetterResource($ratificationLetter);
        }
    }
}
