<?php

namespace App\Exceptions;

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
use Illuminate\Support\Facades\Mail;
use Symfony\Component\ErrorHandler\Exception\FlattenException;
use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed for validation exceptions.
     *
     * @var array
     */
    protected $dontFlash = [
        'password',
        'password_confirmation',
    ];

    /**
     * Report or log an exception.
     *
     * @param  \Throwable  $exception
     * @return void
     *
     * @throws \Exception
     */
    public function report(Throwable $exception)
    {
        if ($this->shouldReport($exception)) {
            $this->sendEmail($exception);
        }
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Throwable  $exception
     * @return \Symfony\Component\HttpFoundation\Response
     *
     * @throws \Throwable
     */
    public function render($request, Throwable $exception)
    {
        return parent::render($request, $exception);
    }

    public function sendEmail(Throwable $exception)
    {
        try {
            $e = FlattenException::create($exception);
            $handler = new HtmlErrorRenderer(true); // boolean, true raises debug flag...

            $css = $handler->getStylesheet();
            $content = $handler->getBody($e);
            //Mail::to(config('app.exception_mail'))->send(new MailContact($contact));
            // Verwende normale Mail-Klasse statt Facade, um Probleme bei der Initialisierung zu vermeiden
            $to = config('app.exception_mail');
            $subject = 'gruene-seele Exception: ' . \Request::fullUrl();

            if ($to) {
                \Mail::send('emails.exception', compact('css', 'content'), function ($message) use ($to, $subject) {
                    $message
                        ->to($to)
                        ->subject($subject)
                    ;
                });
            }
        } catch (Throwable $ex) {
            // Einfache Fehlerprotokollierung ohne Facade
            file_put_contents(
                storage_path('logs/laravel-' . date('Y-m-d') . '.log'),
                '[' . date('Y-m-d H:i:s') . '] exception-handler-error: ' . $ex->getMessage() . "\n",
                FILE_APPEND
            );
        }
    }
}
