<?php

namespace App\Contribution\Actions;

use App\Contribution\ContributionFactory;
use App\Contribution\Documents\ContributionDocument;
use App\Rules\JsonBase64Rule;
use Illuminate\Support\Facades\Validator;
use Lorisleiva\Actions\ActionRequest;
use Lorisleiva\Actions\Concerns\AsAction;
use Zoomyboy\Tex\BaseCompiler;
use Zoomyboy\Tex\Tex;

class GenerateAction
{
    use AsAction;

    /**
     * @param class-string<ContributionDocument> $document
     * @param array<string, mixed>               $payload
     */
    public function handle(string $document, array $payload): BaseCompiler
    {
        return Tex::compile($document::fromRequest($payload));
    }

    public function asController(ActionRequest $request): BaseCompiler
    {
        $payload = $this->payload($request);
        $type = data_get($payload, 'type');
        ValidateAction::validateType($type);
        Validator::make($payload, app(ContributionFactory::class)->rules($type))->validate();

        return $this->handle($type, $payload);
    }

    /**
     * @return array<string, mixed>
     */
    public function rules(): array
    {
        return [
            'payload' => [new JsonBase64Rule()],
        ];
    }

    /**
     * @return array<string, string>
     */
    private function payload(ActionRequest $request): array
    {
        return json_decode(base64_decode($request->input('payload', '')), true);
    }
}
