<?php

namespace App\Services;

use Illuminate\Support\Facades\Log;

class LoggingService
{
    /**
     * Log order-related events
     */
    public function logOrder(string $level, string $message, array $context = []): void
    {
        $this->log('order', $level, $message, $context);
    }

    /**
     * Log payment-related events
     */
    public function logPayment(string $level, string $message, array $context = []): void
    {
        $this->log('payment', $level, $message, $context);
    }

    /**
     * Log inventory-related events
     */
    public function logInventory(string $level, string $message, array $context = []): void
    {
        $this->log('inventory', $level, $message, $context);
    }

    /**
     * Log user-related events
     */
    public function logUser(string $level, string $message, array $context = []): void
    {
        $this->log('user', $level, $message, $context);
    }

    /**
     * Log API-related events
     */
    public function logApi(string $level, string $message, array $context = []): void
    {
        $this->log('api', $level, $message, $context);
    }

    /**
     * Log webhook events
     */
    public function logWebhook(string $level, string $message, array $context = []): void
    {
        $this->log('webhook', $level, $message, $context);
    }

    /**
     * Log with structured context
     */
    protected function log(string $category, string $level, string $message, array $context = []): void
    {
        $enrichedContext = array_merge([
            'category' => $category,
            'timestamp' => now()->toIso8601String(),
            'environment' => app()->environment(),
        ], $context);

        // Add user context if available
        if (auth()->check()) {
            $enrichedContext['user_id'] = auth()->id();
            $enrichedContext['user_email'] = auth()->user()->email ?? null;
        }

        // Add request context if available
        if (request()) {
            $enrichedContext['request_id'] = request()->header('X-Request-ID') ?? uniqid('req_', true);
            $enrichedContext['ip'] = request()->ip();
            $enrichedContext['user_agent'] = request()->userAgent();
            $enrichedContext['url'] = request()->fullUrl();
            $enrichedContext['method'] = request()->method();
        }

        // Log with appropriate level
        match ($level) {
            'emergency' => Log::emergency($message, $enrichedContext),
            'alert' => Log::alert($message, $enrichedContext),
            'critical' => Log::critical($message, $enrichedContext),
            'error' => Log::error($message, $enrichedContext),
            'warning' => Log::warning($message, $enrichedContext),
            'notice' => Log::notice($message, $enrichedContext),
            'info' => Log::info($message, $enrichedContext),
            'debug' => Log::debug($message, $enrichedContext),
            default => Log::info($message, $enrichedContext),
        };
    }

    /**
     * Log performance metrics
     */
    public function logPerformance(string $operation, float $duration, array $context = []): void
    {
        $this->log('performance', 'info', "Performance: {$operation}", array_merge([
            'operation' => $operation,
            'duration_ms' => round($duration * 1000, 2),
        ], $context));
    }

    /**
     * Log security events
     */
    public function logSecurity(string $level, string $event, array $context = []): void
    {
        $this->log('security', $level, "Security Event: {$event}", $context);
    }
}

