<?php

namespace App\Services\Api\Actions;

use App\Models\Products\LicenseToken;
use App\Models\Products\Product;
use App\Models\Environments\Environment;
use Carbon\Carbon;
use Illuminate\Http\Request;

class LicenceAction implements ActionInterface
{
    public function execute(Request $request, array $payload): array
    {
        /** @var LicenseToken $licenseToken */
        $licenseToken = $request->input('_license_token');

        /** @var Environment $environment */
        $environment = $request->input('_environment');

        /** @var Product $validatedProduct */
        $validatedProduct = $request->input('_validated_product');

        $now = now();

        // Obtener todos los productos activos asociados al token con sus fechas del pivot
        $productsWithPivot = $licenseToken->products()
            ->wherePivot('status', 'active')
            ->where(function ($query) use ($now) {
                $query->whereNull('license_token_product.start_at')
                    ->orWhere('license_token_product.start_at', '<=', $now);
            })
            ->where(function ($query) use ($now) {
                $query->whereNull('license_token_product.end_at')
                    ->orWhere('license_token_product.end_at', '>=', $now);
            })
            ->get();

        // Extraer solo los slugs de los productos autorizados
        $products = $productsWithPivot->pluck('slug')->toArray();

        // Calcular la fecha de expiración más restrictiva
        // Entre el token y el producto específico validado
        $expiresAt = $licenseToken->end_at;

        // Buscar el pivot del producto validado para obtener su fecha de expiración
        $productPivot = $productsWithPivot->firstWhere('id', $validatedProduct->id);
        if ($productPivot && $productPivot->pivot->end_at) {
            // Convertir el pivot->end_at a Carbon (los pivots no tienen casts automáticos)
            $productEndAt = $productPivot->pivot->end_at instanceof \DateTimeInterface 
                ? Carbon::instance($productPivot->pivot->end_at)
                : Carbon::parse($productPivot->pivot->end_at);
            
            // Si el producto tiene una fecha de expiración más restrictiva, usarla
            if (!$expiresAt || $productEndAt->lessThan($expiresAt)) {
                $expiresAt = $productEndAt;
            }
        }

        // Construir respuesta según especificación
        return [
            'expires_at' => $expiresAt?->format('Y-m-d') ?: null,
            'product' => $validatedProduct->slug,
            'products' => $products,
            'environmentid' => $environment->id,
            'support_active' => false, // Por ahora no se implementa lógica de soporte
            'warnings' => [], // Por ahora no se implementan advertencias de versión
        ];
    }
}

