<?php

namespace App\Http\Controllers;

use App\Jobs\GenerateImageCreativeJob;
use App\Models\Creative;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;

class CreativeController extends Controller
{
    public function index(Request $request): View
    {
        $creatives = $request->user()->creatives()
            ->latest()
            ->paginate(10);

        return view('creatives.index', ['creatives' => $creatives]);
    }

    public function create(): View
    {
        return view('creatives.create');
    }

    public function store(Request $request): RedirectResponse
    {
        $validated = $request->validate([
            'source' => 'required|in:prompt,product_url',
            'prompt' => 'required_if:source,prompt|nullable|string|max:2000',
            'product_url' => 'required_if:source,product_url|nullable|url|max:2000',
            'ratio' => 'required|in:1:1,4:5,9:16,16:9',
            'style' => 'nullable|string|max:255',
        ]);

        $creative = $request->user()->creatives()->create([
            'type' => 'image',
            'status' => 'queued',
            'source' => $validated['source'],
            'ratio' => $validated['ratio'],
            'style' => $validated['style'] ?? null,
            'product_url' => $validated['product_url'] ?? null,
            'prompt' => $validated['prompt'] ?? null,
        ]);

        try {
            GenerateImageCreativeJob::dispatch($creative->id);
        } catch (\Throwable $e) {
            // The job already records failure on the creative before rethrowing
            // (so queue workers can retry it); with the sync driver that rethrow
            // would otherwise surface as a 500 instead of the failed-status page.
        }

        return redirect()->route('creatives.show', $creative);
    }

    public function show(Creative $creative): View
    {
        $this->authorizeCreative($creative);

        return view('creatives.show', ['creative' => $creative]);
    }

    public function destroy(Creative $creative): RedirectResponse
    {
        $this->authorizeCreative($creative);

        $creative->delete();

        return redirect()->route('creatives.index');
    }

    private function authorizeCreative(Creative $creative): void
    {
        abort_unless($creative->user_id === auth()->id(), 403);
    }
}
