<?php

namespace App\Livewire\LicenseTokens;

use App\Models\Clients\Client;
use App\Models\Products\LicenseToken;
use Illuminate\Support\Facades\Auth;
use Livewire\Component;

class Create extends Component
{
    public ?int $client_id = null;
    public ?string $name = null;
    public string $token = '';
    public bool $active = false;
    public ?string $mode = null;
    public ?int $usage_limit = null;
    public ?string $start_at = null;
    public ?string $end_at = null;
    public ?string $metadata = null;
    public ?string $observation = null;

    protected function rules()
    {
        return [
            'client_id' => 'required|exists:clients,id',
            'name' => 'nullable|string|max:255',
            'token' => 'required|string|max:100|unique:license_tokens,token',
            'active' => 'nullable|boolean',
            'start_at' => 'nullable|date',
            'end_at' => 'nullable|date|after_or_equal:start_at',
            'mode' => 'nullable|string|max:50',
            'usage_limit' => 'nullable|integer|min:1',
            'metadata' => 'nullable|string',
            'observation' => 'nullable|string',
        ];
    }

    public function generateToken()
    {
        $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        
        do {
            // Generar token con patrón: 3IP-XXXX-XXXX-XXXX-XXXX
            $blocks = [];
            for ($i = 0; $i < 4; $i++) {
                $block = '';
                for ($j = 0; $j < 4; $j++) {
                    $block .= $characters[random_int(0, strlen($characters) - 1)];
                }
                $blocks[] = $block;
            }
            $generatedToken = '3IP-' . implode('-', $blocks);
        } while (LicenseToken::where('token', $generatedToken)->exists());

        $this->token = $generatedToken;
    }

    public function save()
    {
        $this->authorize('admin.license-tokens.create');
        
        $validated = $this->validate();
        $validated['active'] = $this->active;
        $validated['created_by'] = Auth::id();

        // Procesar metadata JSON
        if (!empty($validated['metadata'])) {
            $decoded = json_decode($validated['metadata'], true);
            $validated['metadata'] = json_last_error() === JSON_ERROR_NONE ? $decoded : null;
        } else {
            $validated['metadata'] = null;
        }

        LicenseToken::create($validated);

        session()->flash('success', 'Token creado correctamente.');

        return $this->redirect(route('license_tokens.index'), navigate: true);
    }

    public function render()
    {
        return view('livewire.license-tokens.create', [
            'clients' => Client::orderBy('name')->get(),
        ])->layout('layouts.app');
    }
}

