<?php
namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
use Throwable;

class ExceptionReport extends Mailable
{
    use Queueable;
    use SerializesModels;

    public $exception;
    public $errorData;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct(Throwable $exception)
    {
        $this->exception = $exception;
        $this->errorData = $this->buildErrorData($exception);
    }

    /**
     * Get the message envelope.
     *
     * @return \Illuminate\Mail\Mailables\Envelope
     */
    public function envelope()
    {
        return new Envelope(
            subject: '🚨 Exception Report - ' . config('app.name') . ' (' . app()->environment() . ')',
        );
    }

    /**
     * Get the message content definition.
     *
     * @return \Illuminate\Mail\Mailables\Content
     */
    public function content()
    {
        return new Content(
            markdown: 'emails.exception-report',
        );
    }

    /**
     * Get the attachments for the message.
     *
     * @return array
     */
    public function attachments()
    {
        return [];
    }

    /**
     * Build comprehensive error data
     */
    private function buildErrorData(Throwable $exception)
    {
        return [
            'message' => $exception->getMessage(),
            'exception_class' => get_class($exception),
            'file' => $exception->getFile(),
            'line' => $exception->getLine(),
            'code' => $exception->getCode(),
            'url' => request()->fullUrl() ?? 'N/A',
            'method' => request()->method() ?? 'N/A',
            'ip' => request()->ip() ?? 'N/A',
            'user_agent' => request()->userAgent() ?? 'N/A',
            'user_id' => auth()->id() ?? 'Guest',
            'user_email' => auth()->user()->email ?? 'N/A',
            'trace' => $exception->getTraceAsString(),
            'previous' => $exception->getPrevious() ? $exception->getPrevious()->getMessage() : null,
            'timestamp' => now()->format('Y-m-d H:i:s T'),
            'environment' => app()->environment(),
            'request_data' => $this->sanitizeRequestData(),
            'headers' => $this->getImportantHeaders(),
            'memory_usage' => round(memory_get_usage(true) / 1024 / 1024, 2) . ' MB',
            'php_version' => PHP_VERSION,
            'laravel_version' => app()->version(),
        ];
    }

    /**
     * Get sanitized request data
     */
    private function sanitizeRequestData()
    {
        if (!request()->isMethod('get')) {
            $data = request()->all();
            
            // Remove sensitive data
            unset($data['password'], $data['password_confirmation'], $data['_token'], $data['api_key']);
            
            return $data;
        }
        
        return request()->query();
    }

    /**
     * Get important request headers
     */
    private function getImportantHeaders()
    {
        $headers = [];
        $importantHeaders = ['referer', 'accept', 'accept-encoding', 'accept-language'];
        
        foreach ($importantHeaders as $header) {
            if (request()->hasHeader($header)) {
                $headers[$header] = request()->header($header);
            }
        }
        
        return $headers;
    }
}

