<?php

namespace App\Exceptions;


use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Foundation\Http\Exceptions\MaintenanceModeException;
use Illuminate\Session\TokenMismatchException;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class ErrorReporting
{

    static $apiUrl = 'http://errortracker.npontu.com/api';

    static $dontReport = [
        AuthenticationException::class, AuthorizationException::class, ModelNotFoundException::class, TokenMismatchException::class, ValidationException::class, NotFoundHttpException::class, MaintenanceModeException::class, HttpException::class
    ];

    public static function report(\Exception $exception) {
        if(!env('REPORT_ERROR', false)) return;
        foreach (self::$dontReport as $dontReportClass)
            if($exception instanceof $dontReportClass)
                return;
        $stack = [];
        foreach ($exception->getTrace() as $trace)
            $stack[] = self::parseStackTrace($trace);
        $requestParm = ['accessToken' => env('ERROR_ACCESS_TOKEN', ''), 'errorMessage' =>  '"'.$exception->getMessage().'" in file "'.$exception->getFile().'" line '.$exception->getLine(), 'errorLevel' => 'Error', 'appEnv' => env('APP_ENV', 'local'), 'stacktrace' => $stack, 'cli_args' => isset($argv) && !empty($argv) ?: [], 'request' => request()->all(), 'session' => session()->all(), 'server' => request()->server->all(), 'currentUser' => Auth::user() != null ? Auth::user()->toArray() : []];
        $ch = curl_init(self::$apiUrl); $payload = json_encode($requestParm);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'Content-Length: ' . strlen($payload)]);
        curl_exec ($ch); curl_close ($ch);
    }

    private static function parseStackTrace($array) {
        $str = '';
        if(isset($array['file']) && isset($array['line']))
            $str .= 'File "'.$array['file'].'" line '.$array['line'];
        $str .= ' in ';
        if(isset($array['class'])) $str .= $array['class'].'::';
        if(isset($array['function'])) $str .= $array['function'];
        return $str;
    }

}