<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

class Sanitizer
{
    public function handle(Request $request, Closure $next)
    {
        $whitelist_url = ['admin/consumer-documents/{id}/download', 'api/karza/webhook', 'admin/grade/save'];

        $route = Route::getRoutes()->match($request);
        $requestRoute = $route->uri();

        if (in_array($requestRoute, $whitelist_url)){
            return $next($request);
        }

        $input = $request->all();

        array_walk_recursive($input, function (&$value, $key) {
            if (!is_null($value) && !$this->ignoreKeys($value, $key)) {
                $value = htmlspecialchars(strip_tags($value), ENT_QUOTES, 'UTF-8');
            }
        });

        $request->merge($input);

        return $next($request);
    }

    private function ignoreKeys($value, $key){
        $lists = [
            'having_list' => ['type' => 'JSON'],
            'exception_doc_list' => ['type' => 'JSON'],
            'multi_tranche_exception_list' => ['type' => 'JSON'],
            'data' => ['type' => 'JSON'],
            'search_filter' => ['type' => 'URL'],
            'contacts' => ['type' => 'JSON'],
            'req_base' => ['type' => 'JSON']
        ];
        foreach ($lists as $key_name => $list){
            if ($key_name == $key){
                switch ($list['type']){
                    case 'JSON':
                        return $this->isValidJson($value);
                        break;
                    case 'URL':
                        return true;
                        break;
                    default:
                        return false;
                        break;
                }
            }
        }

        return false;
    }

    private function isValidJson($string) {
        json_decode($string);
        return (json_last_error() === JSON_ERROR_NONE);
    }
}
