<?php

namespace App\Domains\Catalog\Resources;

use App\Domains\Catalog\Models\CatalogItem;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

/** @mixin CatalogItem */
class CatalogItemResource extends JsonResource
{
    /** @return array<string, mixed> */
    public function toArray(Request $request): array
    {
        return [
            'id' => $this->id,
            'type' => $this->type->value,
            'category_id' => $this->category_id,
            'brand_id' => $this->brand_id,
            'slug' => $this->slug,
            'nombre' => $this->nombre,
            'descripcion' => $this->descripcion,
            'precio' => $this->precio,
            'inventory_policy' => $this->inventory_policy?->value,
            'inventory_subject' => $this->inventory_subject->value,
            'max_units_per_user' => $this->max_units_per_user,
            'has_tickets' => $this->has_tickets,
            'real_stock' => $this->whenLoaded('inventory', fn () => $this->inventory?->real_stock),
            'images' => $this->whenLoaded('attachments', fn () => $this->attachments
                ->map(fn ($attachment) => $attachment->getTemporaryUrl(1440))
                ->values()),
            'variants' => $this->whenLoaded('variants', fn () => $this->variants
                ->map(fn ($variant) => [
                    'id' => $variant->id,
                    'event_date_id' => $variant->event_date_id,
                    'event_date' => $variant->eventDate?->date?->format('Y-m-d'),
                    'event_date_ids' => $variant->selectedEventDates()->pluck('id')->values(),
                    'event_dates' => $variant->selectedEventDates()->map(fn ($eventDate): string => $eventDate->date->format('Y-m-d'))->values(),
                    'descripcion' => $variant->getDescription(),
                    'precio' => number_format($variant->getPrice(), 2, '.', ''),
                    'real_stock' => $variant->inventory?->real_stock,
                    'values' => $variant->selectorOptions($this->itemAttributes),
                    'images' => $variant->attachments
                        ->map(fn ($attachment) => $attachment->getTemporaryUrl(1440))
                        ->values(),
                ])
                ->values()),
        ];
    }
}
