<?php

namespace App\Http\Controllers\Client;

use App\Http\Controllers\Controller;
use App\Http\Requests\Passport\AuthLogin;
use App\Models\Plan;
use App\Models\User;
use App\Services\ServerService;
use App\Services\UserService;
use App\Utils\ApiResponse;
use App\Utils\CacheKey;
use App\Utils\Helper;
use Facade\FlareClient\Api;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;


class ManageController extends Controller
{
    /**
     * 登录接口
     * @param AuthLogin $request
     * @return false|string
     */
    function login(Request $request)
    {
        $email = $request->input('email');
        $password = $request->input('password');

        if (empty($email)){
            return ApiResponse::apiResponse(400,"邮箱不能为空");
        }

        if (empty($password)){
            return ApiResponse::apiResponse(400,"密码不能为空");
        }

        $user = User::where('email', $email)->first();
        if (!$user) {
            //abort(200, __('Incorrect email or password'));
            return ApiResponse::apiResponse(400,"账号或者密码错误");
        }
        if (!Helper::multiPasswordVerify(
            $user->password_algo,
            $user->password_salt,
            $password,
            $user->password)
        ) {
            return ApiResponse::apiResponse(400,"账号或者密码错误");
        }

        if ($user->banned) {
//            abort(500, __('Your account has been suspended'));
            return ApiResponse::apiResponse(300,"账户已经被禁用");
        }

        $data = [
            'token' => $user->token,
            'auth_data' => base64_encode("{$user->email}:{$user->password}")
        ];

        if ($user->is_admin) $data['is_admin'] = true;
//        return response([
//            'data' => $data
//        ]);
        return ApiResponse::apiResponse(0,"",$data);
    }

    /**
     * 注册接口
     * @return \Illuminate\Http\JsonResponse
     */
    function register(Request $request)
    {
        if ((int)config('v2board.register_limit_by_ip_enable', 0)) {
            $registerCountByIP = Cache::get(CacheKey::get('REGISTER_IP_RATE_LIMIT', $request->ip())) ?? 0;
            if ((int)$registerCountByIP >= (int)config('v2board.register_limit_count', 3)) {
                abort(500, __('Register frequently, please try again after 1 hour'));
            }
        }

        $email = $request->input('email');
        $password = $request->input('password');
        $exist = User::where('email', $email)->first();
        if ($exist) {
            return ApiResponse::apiResponse(400,"账号已经存在");
        }
        $user = new User();
        $user->email = $email;
        $user->password = password_hash($password, PASSWORD_DEFAULT);
        $user->uuid = Helper::guid(true);
        $user->token = Helper::guid();
        // try out
        if ((int)config('v2board.try_out_plan_id', 0)) {
            $plan = Plan::find(config('v2board.try_out_plan_id'));
            if ($plan) {
                $user->transfer_enable = $plan->transfer_enable * 1073741824;
                $user->plan_id = $plan->id;
                $user->group_id = $plan->group_id;
                $user->expired_at = time() + (config('v2board.try_out_hour', 1) * 3600);
            }
        }
        if (!$user->save()) {
            return ApiResponse::apiResponse(400,"注册失败");
        }

        $data = [
            'token' => $user->token,
            'auth_data' => base64_encode("{$user->email}:{$user->password}")
        ];

        $user->last_login_at = time();
        $user->save();

        if ((int)config('v2board.register_limit_by_ip_enable', 0)) {
            Cache::put(
                CacheKey::get('REGISTER_IP_RATE_LIMIT', $request->ip()),
                (int)$registerCountByIP + 1,
                (int)config('v2board.register_limit_expire', 60) * 60
            );
        }
        return ApiResponse::apiResponse(0,"注册成功",$data);
    }

    /**
     * 获取我的订阅
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function getSubscribe(Request $request)
    {
        $user = User::where('id', $request->user['id'])
            ->select([
                'plan_id',
                'token',
                'expired_at',
                'u',
                'd',
                'transfer_enable',
                'email'
            ])
            ->first();
        if (!$user) {
            abort(500, __('The user does not exist'));
        }
        if ($user->plan_id) {
            $user['plan'] = Plan::find($user->plan_id);
            if (!$user['plan']) {
                abort(500, __('Subscription plan does not exist'));
            }
        }
        $user['subscribe_url'] = Helper::getSubscribeUrl("/api/v1/client/subscribe?token={$user['token']}");
        $userService = new UserService();
        $user['reset_day'] = $userService->getResetDay($user);
        return ApiResponse::apiResponse(0,"",$user);
    }

    /**
     * 获取订阅套餐
     * @param Request $request
     * @return
     */
    public function fetch(Request $request)
    {
        $plan = Plan::where('show', 1)->get();
        return ApiResponse::apiResponse(0,"",$plan);
    }

    /**
     * 获取线路
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function server(Request $request){
        $user = User::find($request->user['id']);
        $servers = [];
        $userService = new UserService();
        if ($userService->isAvailable($user)) {
            $serverService = new ServerService();
            $servers = $serverService->getAvailableServers($user);
        }
        if (empty($servers)){
            return ApiResponse::apiResponse(400,"获取线路失败");
        }
        return ApiResponse::apiResponse(0,"",$servers);
    }


    public function getQuickLoginUrl(Request $request)
    {
        $authorization = $request->input('auth_data') ?? $request->header('authorization');
        if (!$authorization)
            return ApiResponse::apiResponse(403,"未登录或者登录已经过期");

        $authData = explode(':', base64_decode($authorization));
        if (!isset($authData[0]) || !isset($authData[1]))
            return ApiResponse::apiResponse(403,"请求异常");
        $user = User::where('email', $authData[0])
            ->where('password', $authData[1])
            ->first();
        if (!$user) {
            //abort(500, __('Token error'));
            return ApiResponse::apiResponse(500,"请求异常");
        }

        $code = Helper::guid();
        $key = CacheKey::get('TEMP_TOKEN', $code);
        Cache::put($key, $user->id, 60);
        $redirect = '/#/login?verify=' . $code . '&redirect=' . ($request->input('redirect') ? $request->input('redirect') : 'dashboard');
        if (config('v2board.app_url')) {
            $url = config('v2board.app_url') . $redirect;
        } else {
            $url = url($redirect);
        }

        return ApiResponse::apiResponse(0,"",$url);
    }


    public function getVersion(Request $request)
    {
       $from = $request->input("from");
       $version = $request->input("version");

       $versionData = [
        'windows_version' => config('v2board.windows_version'),
        'windows_download_url' => config('v2board.windows_download_url'),
        'macos_version' => config('v2board.macos_version'),
        'macos_download_url' => config('v2board.macos_download_url'),
        'android_version' => config('v2board.android_version'),
        'android_download_url' => config('v2board.android_download_url')
        ];

        $sVersion = "";
        $sDownloadUrl = "";
        if ($from == "android")
        {
            $sVersion = $versionData["android_version"];
            $sDownloadUrl = $versionData["android_download_url"];

        } else if ($from == "win"){
            $sVersion = $versionData["windows_version"];
            $sDownloadUrl = $versionData["windows_download_url"];
        }
        else if ($from == "macos")
        {
            $sVersion = $versionData["macos_version"];
            $sDownloadUrl = $versionData["macos_download_url"];
        }


       $data = [
         'version' => $sVersion,
         'download_url' => $sDownloadUrl,
       ];

       if (version_compare($sVersion,$version,">")){
           //服务器大于客户端
           $data["isUpdate"] = 1;
           return ApiResponse::apiResponse(0,"服务器有更新",$data);
       }

        $data["isUpdate"] = 0;
        return ApiResponse::apiResponse(0,"服务器没有更新",$data);

    }

//    private function Token(Request $request){
//        $authorization = $request->input('auth_data') ?? $request->header('authorization');
//        if (!$authorization)
//            return 402;
//
//        $authData = explode(':', base64_decode($authorization));
//        if (!isset($authData[0]) || !isset($authData[1]))
//            return 403;
//        $user = User::where('email', $authData[0])
//            ->where('password', $authData[1])
//            ->first();
//        if (!$user) {
//            //abort(500, __('Token error'));
//            //return ApiResponse::apiResponse(500,"请求异常");
//            return 404;
//        }
//
//        return $user;
//    }
}