<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Yajny\Member\Models\Member;
use Yajny\Models\Region;

class AppLocalization
{
    private $regionCurrencyMapper = [];

    public function __construct()
    {
        $this->regionCurrencyMapper = Cache::rememberForever('regionCurrencyMapper', function () {
            return Region::getRegionsCurrency();
        });
    }

    public function handle(Request $request, Closure $next)
    {
        $requestRegion = $request->header('region');
        $requestLang = $request->header('lang', config('website.cnf_lang'));

        if ($request->has('user_id')) {
            $user = Member::find($request->user_id);
            if ($user) {
                if($user->active != 1)
                    return response()->json(['error' => 'account_suspended'], 406);

                $appPlatform = $request->header('platform');
                if ($appPlatform && (!isset($user->platform) || $user->platform != $appPlatform)) {
                    $user->platform = $appPlatform;
                }

                $userCurrency = 'USD';
                if (isset($user->country_code)) {
                    $userCurrency = $user->currency_code;
                } elseif (isset($requestRegion) && isset($this->regionCurrencyMapper[$requestRegion])) {
                    $userCurrency = $this->regionCurrencyMapper[$requestRegion];
                }

                $user->currency_code = $userCurrency;

                $request->merge([
                    'region' => $user->app_region,
                    'lang' => $user->app_lang ?? config('website.cnf_lang'),
                    'userCurrency' => $userCurrency,
                    'is_merchant' => $user->is_merchant
                ]);

                $user->save();
                app('translator')->setLocale($user->app_lang ?? config('website.cnf_lang'));
            }
        } else {
            $request->merge([
                'region' => $requestRegion,
                'lang' => $requestLang,
                'userCurrency' => isset($requestRegion) && isset($this->regionCurrencyMapper[$requestRegion]) ? $this->regionCurrencyMapper[$requestRegion] : 'USD'
            ]);
        }

        app('translator')->setLocale($request->lang);
        return $next($request);
    }
}
