<?php

use Opcodes\LogViewer\LogLevels\LevelClass;

if (!function_exists('renv')) {
	function renv(string $cst, ?string $default = null): string
	{
		return rtrim((string) (env($cst, $default) ?? ''), '/');
	}
}

/**
 * Allow to conditionally append an env value.
 *
 * @param string $cst constant to fetch
 *
 * @return string '' or env value prefixed with '/'
 */
if (!function_exists('renv_cond')) {
	function renv_cond(string $cst): string
	{
		return env($cst, '') === '' ? '' : ('/' . trim((string) env($cst), '/'));
	}
}

return [
	/*
	|--------------------------------------------------------------------------
	| Log Viewer
	|--------------------------------------------------------------------------
	| Log Viewer can be disabled, so it's no longer accessible via browser.
	|
	*/

	'enabled' => env('LOG_VIEWER_ENABLED', true),

	/*
	|--------------------------------------------------------------------------
	| Log Viewer Domain
	|--------------------------------------------------------------------------
	| You may change the domain where Log Viewer should be active.
	| If the domain is empty, all domains will be valid.
	|
	*/

	'route_domain' => null,

	/*
	|--------------------------------------------------------------------------
	| Log Viewer Route
	|--------------------------------------------------------------------------
	| Log Viewer will be available under this URL.
	|
	*/

	'route_path' => 'Logs',

	/*
	|--------------------------------------------------------------------------
	| Back to system URL
	|--------------------------------------------------------------------------
	| When set, displays a link to easily get back to this URL.
	| Set to `null` to hide this link.
	|
	| Optional label to display for the above URL.
	|
	*/

	'back_to_system_url' => renv('APP_URL', 'http://localhost') . renv_cond('APP_DIR') . '/gallery',

	'back_to_system_label' => null, // Displayed by default: "Back to {{ app.name }}"

	/*
	|--------------------------------------------------------------------------
	| Log Viewer time zone.
	|--------------------------------------------------------------------------
	| The time zone in which to display the times in the UI. Defaults to
	| the application's timezone defined in config/app.php.
	|
	*/

	'timezone' => null,

	/*
	|--------------------------------------------------------------------------
	| Log Viewer route middleware.
	|--------------------------------------------------------------------------
	| Optional middleware to use when loading the initial Log Viewer page.
	|
	*/

	'middleware' => [
		'web-admin',
		\App\Http\Middleware\FixStatusCode::class,
		\Illuminate\Http\Middleware\TrustProxies::class,
		\Opcodes\LogViewer\Http\Middleware\AuthorizeLogViewer::class,
	],

	/*
	|--------------------------------------------------------------------------
	| Log Viewer API middleware.
	|--------------------------------------------------------------------------
	| Optional middleware to use on every API request. The same API is also
	| used from within the Log Viewer user interface.
	|
	*/

	'api_middleware' => [
		\App\Http\Middleware\FixStatusCode::class,
		\Illuminate\Http\Middleware\TrustProxies::class,
		\Opcodes\LogViewer\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
		\Illuminate\Cookie\Middleware\EncryptCookies::class,
		\Illuminate\Session\Middleware\StartSession::class,
		\Illuminate\Session\Middleware\AuthenticateSession::class,
		\App\Http\Middleware\VerifyCsrfToken::class,
		\Opcodes\LogViewer\Http\Middleware\AuthorizeLogViewer::class,
	],

	/*
	|--------------------------------------------------------------------------
	| Log Viewer Remote hosts.
	|--------------------------------------------------------------------------
	| Log Viewer supports viewing Laravel logs from remote hosts. They must
	| be running Log Viewer as well. Below you can define the hosts you
	| would like to show in this Log Viewer instance.
	|
	*/

	'hosts' => [
		'local' => [
			'name' => ucfirst((string) env('APP_ENV', 'local')),
		],

		// 'staging' => [
		//     'name' => 'Staging',
		//     'host' => 'https://staging.example.com/log-viewer',
		//     'auth' => [      // Example of HTTP Basic auth
		//         'username' => 'username',
		//         'password' => 'password',
		//     ],
		// ],
		//
		// 'production' => [
		//     'name' => 'Production',
		//     'host' => 'https://example.com/log-viewer',
		//     'auth' => [      // Example of Bearer token auth
		//         'token' => env('LOG_VIEWER_PRODUCTION_TOKEN'),
		//     ],
		//     'headers' => [
		//         'X-Foo' => 'Bar',
		//     ],
		// ],
	],

	/*
	|--------------------------------------------------------------------------
	| Include file patterns
	|--------------------------------------------------------------------------
	|
	*/

	'include_files' => [
		'*.log',
		'**/*.log',
		// '/absolute/paths/supported',
	],

	/*
	|--------------------------------------------------------------------------
	| Exclude file patterns.
	|--------------------------------------------------------------------------
	| This will take precedence over included files.
	|
	*/

	'exclude_files' => [
		// 'my_secret.log'
	],

	/*
	|--------------------------------------------------------------------------
	|  Shorter stack trace filters.
	|--------------------------------------------------------------------------
	| Lines containing any of these strings will be excluded from the full log.
	| This setting is only active when the function is enabled via the user interface.
	|
	*/

	'shorter_stack_trace_excludes' => [
		'/vendor/symfony/',
		'/vendor/laravel/framework/',
		'/vendor/barryvdh/laravel-debugbar/',
	],

	/*
	|--------------------------------------------------------------------------
	| Log matching patterns
	|--------------------------------------------------------------------------
	| Regexes for matching log files
	|
	*/

	'patterns' => [
		'laravel' => [
			'log_matching_regex' => '/^\[(\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}\.?(\d{6}([\+-]\d\d:\d\d)?)?)\].*/',

			/**
			 * This pattern, used for processing Laravel logs, returns these results:
			 * $matches[0] - the full log line being tested.
			 * $matches[1] - full timestamp between the square brackets (includes microseconds and timezone offset)
			 * $matches[2] - timestamp microseconds, if available
			 * $matches[3] - timestamp timezone offset, if available
			 * $matches[4] - contents between timestamp and the severity level
			 * $matches[5] - environment (local, production, etc)
			 * $matches[6] - log severity (info, debug, error, etc)
			 * $matches[7] - the log text, the rest of the text.
			 */
			'log_parsing_regex' => '/^\[(\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}\.?(\d{6}([\+-]\d\d:\d\d)?)?)\](.*?(\w+)\.|.*?)('
				. implode('|', array_filter(LevelClass::caseValues(), fn ($elem) => ($elem !== null && $elem !== '')))
				. ')?: (.*?)( in [\/].*?:[0-9]+)?$/is',
		],
	],

	/*
	|--------------------------------------------------------------------------
	| Cache driver
	|--------------------------------------------------------------------------
	| Cache driver to use for storing the log indices. Indices are used to speed up
	| log navigation. Defaults to your application's default cache driver.
	|
	*/

	'cache_driver' => env('LOG_VIEWER_CACHE_DRIVER', null),

	/*
	|--------------------------------------------------------------------------
	| Chunk size when scanning log files lazily
	|--------------------------------------------------------------------------
	| The size in MB of files to scan before updating the progress bar when searching across all files.
	|
	*/

	'lazy_scan_chunk_size_in_mb' => 50,
];
