<?php

namespace App\Logging;

use Aws\CloudWatchLogs\CloudWatchLogsClient;
use Monolog\Logger;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\SyslogHandler;
use App\Slack;
use Illuminate\Http\Request;

class CloudWatchLoggerFactory
{

    public $awsCredentials = [];
    public $name;

    public function logger($message){
        try{
            //$message = json_decode($message,1);
            //$log_message = $this->secureLogData($message);
            $name = _env('LOG_CHANNEL');
            $awsCredentials = [
                'region' => _env('AWS_DEFAULT_REGION'),
                'version' => _env('CLOUDWATCH_VERSION'),
                'credentials' => [
                    'key' => _env('CLOUDWATCH_ACCESS_KEY'),
                    'secret' => _env('CLOUDWATCH_SECRET_KEY')
                ]
            ];
            $cwGroupName = _env('CLOUDWATCH_GROUP');
            // Log stream name, will be created if none
            $cwStreamNameInstance = _env('CLOUDWATCH_STREAM');
            // Days to keep logs, 14 by default
            $cwRetentionDays = 90;
            $client = new CloudWatchLogsClient($awsCredentials);
            $payload = array(
                // logGroupName is required
                'logGroupName' => "/aws/cf-admin-laravel",
                // logStreamName is required
                'logStreamName' => "cf-admin-laravel",
                // logEvents is required
                'logEvents' => array(
                    array(
                        // timestamp is required
                        'timestamp' => round(microtime(true) * 1000),
                        // message is required
                        'message' => $message,
                    )
                ),
                //'sequenceToken' => '49039859537023259454236708871034480493247596220116341028',
            );
            return $client->putLogEvents($payload);
        }catch(\Exception $e){
//            (new Slack(new Request(['title' => 'CloudWatch', 'fields' => ['error'=>$e->getMessage(),'line'=>$e->getLine(),'trace'=>$e->getTraceAsString()], 'group' => Slack::$STAGE_TESTING])))->send();
        }
    }

    private function secureLogData($message){
        $keysToCheck = ['pan_card', 'panCard', 'pan', 'mobile', 'mobile_number', 'address', 'aadhaar', 'aadhaar_card', 'current_address', 'permanent_address'];

        foreach ($message as $key => $value) {
            if ($this->isJsonDecodable($value)) {
                $value = json_decode($value, 1);
            }

            if (is_array($value)) {
                // Recursive call for nested arrays
                $value = $this->secureLogData($value);
                $message[$key] = $value;
            } elseif (in_array($key, $keysToCheck)) {
                // Masking the value
                $message[$key] = preg_replace_callback('/\b\w+\b/', function ($match) {
                    return str_repeat('*', strlen($match[0]));
                }, $value);
            }
        }

        return json_encode($message);
    }

    private function isJsonDecodable($string) {
        if (empty($string)) {
            return false;
        }

        json_decode($string);
        return (json_last_error() === JSON_ERROR_NONE);
    }
}
