<?php

namespace App\Observers;

use App\Models\Producto;
use App\Models\User;
use App\Notifications\StockMinimoNotificacion;
use App\Mail\AlertaStockMail;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;

class ProductoObserver
{
    public function saved(Producto $producto): void
    {
        // Solo verificar si no es un producto recién creado
        if ($producto->wasRecentlyCreated) {
            return;
        }

        $stockActual = $producto->getStockEfectivo();

        $alertaStockMinimo = collect();
        $alertaStockMaximo = collect();

        // Verificar stock mínimo
        if ($stockActual <= $producto->stock_minimo && $producto->stock_minimo > 0) {
            $alertaStockMinimo->push($producto);
            Log::info("Stock mínimo alcanzado para producto: {$producto->nombre} (Stock: {$stockActual})");
        }

        // Verificar stock máximo
        if ($producto->stock_maximo && $stockActual > $producto->stock_maximo) {
            $alertaStockMaximo->push($producto);
            Log::info("Stock máximo excedido para producto: {$producto->nombre} (Stock: {$stockActual})");
        }

        // Enviar alertas si hay productos que requieren atención
        if ($alertaStockMinimo->isNotEmpty() || $alertaStockMaximo->isNotEmpty()) {
            $this->enviarAlertasStock($alertaStockMinimo, $alertaStockMaximo);
        }
    }

    private function enviarAlertasStock($productosStockMinimo, $productosStockMaximo)
    {
        // Obtener todos los usuarios con el rol 'Administrador'
        $administradores = User::role('Administrador')->get();

        if ($administradores->isEmpty()) {
            Log::warning('No se encontraron usuarios con el rol Administrador para enviar alertas de stock.');
            return;
        }

        foreach ($administradores as $admin) {
            try {
                // Enviar usando el nuevo sistema de alertas
                Mail::to($admin->email)->send(new AlertaStockMail(
                    $productosStockMinimo,
                    $productosStockMaximo,
                    $admin->email
                ));
                
                Log::info("Alerta de stock enviada a: {$admin->email}");
            } catch (\Exception $e) {
                Log::error("Error al enviar alerta de stock a {$admin->email}: " . $e->getMessage());
            }
        }
    }
}
