<?php

namespace App\Http\Controllers\Mobile\Auth;

use Aix\Sms\Contracts\Smser;
use App\Http\Controllers\Mobile\MobileBaseController;
use App\Models\Member;
use App\Services\Auth\AuthService;
use App\Services\Auth\RegisterService;
use App\Services\Common\GeetestService;
use App\Services\Common\SmsService;
use App\Services\Common\TencentCaptchaService;
use App\Services\CommonService;
use App\Validators\AuthValidatorRequest;
use Closure;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cache;

class LoginController extends MobileBaseController
{
    /**
     * @var AuthService
     */
    protected $authService;

    /**
     * @var SmsService
     */
    protected $smsService;

    /**
     * @var GeetestService
     */
    protected $geetestService;

    protected $sub_site = '';

    protected $tencentCaptchaService;


    /**
     * LoginController constructor.
     * @param AuthService $authService
     * @param SmsService $smsService
     * @param GeetestService $geetestService
     */
    public function __construct(
        AuthService $authService,
        SmsService $smsService,
        GeetestService $geetestService,
        TencentCaptchaService $tencentCaptchaService
    )
    {
        $this->authService    = $authService;
        $this->smsService     = $smsService;
        $this->geetestService = $geetestService;
        $this->tencentCaptchaService = $tencentCaptchaService;
        /*$this->middleware(function ($request, Closure $next) {
            if (strpos($request->route()->getName(), 'mobile.logout') === false) {
                if (Auth::guard('web-member')->check() || Auth::guard('web-company')->check()) {
                    return redirect(route('mobile.home'));
                }
            }
            return $next($request);
        });*/
        if (get_subsite_id() > 0) {
            $this->sub_site = 'jkq.';
        }
    }


    public function showLoginForm()
    {
        if (request()->has('redirect_url')) {
            session(['url.intended' => urldecode(request()->get('redirect_url'))]);
        }
        return view('mobile.app.auth.login', ['wap_title' => "个人登录"]);
    }

    public function showLoginMobileForm()
    {
        if (request()->has('redirect_url')) {
            session(['url.intended' => urldecode(request()->get('redirect_url'))]);
        }
        return view('mobile.app.auth.login_mobile', ['wap_title' => "个人登录"]);
    }

    public function showLoginCompanyForm()
    {
        if (request()->has('redirect_url')) {
            session(['url.intended' => urldecode(request()->get('redirect_url'))]);
        }
        return view('mobile.app.auth.login_company', ['wap_title' => "企业登录"]);
    }

    public function loginByAccount(AuthValidatorRequest $request)
    {
//        if (!$this->geetestService->checkGeetest(config('aix.system.site_safety.site_vo_code.members_login'))) {
//            return $this->sendErrorResponse("验证码不通过,请重新验证", ['is_need_geetest' => 1]);
//        }
        if(!$this->tencentCaptchaService->check($request->input('randstr'),$request->input('ticket'),$request->ip())){
            return $this->sendErrorResponse("验证码不通过,请重新验证");
        }

        if (!$member = $this->authService->loginByAccount($request->account, $request->password, $request->autoLogin)) {
//            $data['is_need_geetest'] = $this->geetestService->isNeedGeetest(
//                config('aix.system.site_safety.site_vo_code.members_login')
//            );

            $redis = Cache::getRedis();
            $value = $redis->get('user_' . $request->account);
            //dd($value);
            if (!$value) {
                $value = 0;
            }
            if ($value >= 5) {
                $redis->expire('user_' . $request->account, 900);
                return $this->sendErrorResponse("连续登录失败5次,请15分钟后再尝试!");
            }
            $redis->set('user_' . $request->account, ++$value);

            return $this->sendErrorResponse("账号或密码错误或密码已超过90天未修改,请使用找回密码功能");

        }
        if ($member->status == 0) {
            Auth::guard('web-member')->logout();
            return $this->sendErrorResponse("你的账号处于封禁状态, 请联系管理员");
        }
        $token = CommonService::createToken(1, $member->id);
        return $this->sendSuccessResponse([
            'redirect_url' => url($request->session()
                ->pull('url.intended', route($this->sub_site . 'mobile.person.index'))),
            'token'        => $token,
        ]);
    }

    public function loginBySms(AuthValidatorRequest $request)
    {
//        if (!$this->geetestService->checkGeetest(config('aix.system.site_safety.site_vo_code.members_login'))) {
//            return $this->sendErrorResponse("验证码不通过,请重新验证", ['is_need_geetest' => 1]);
//        }
        if (!$this->smsService->checkAuthSms(
            $request->mobile,
            Smser::TEMPLATE_AUTH_LOGIN,
            $request->code
        )) {
            $data['is_need_geetest'] = $this->geetestService->isNeedGeetest(
                config('aix.system.site_safety.site_vo_code.members_login')
            );
            return $this->sendErrorResponse("短信验证码不对", $data);
        }
        if (!$member = $this->authService->loginByAccount($request->mobile, '', $request->autoLogin)) {
            $data['is_need_geetest'] = $this->geetestService->isNeedGeetest(
                config('aix.system.site_safety.site_vo_code.members_login')
            );
            return $this->sendErrorResponse("用户不存在,请先注册账号", $data);
        }
        if ($member->status == 0) {
            Auth::guard('web-member')->logout();
            return $this->sendErrorResponse("你的账号处于封禁状态, 请联系管理员");
        }
        $token = CommonService::createToken(1, $member->id);
        return $this->sendSuccessResponse([
            'redirect_url' => url($request->session()
                ->pull('url.intended', route($this->sub_site . 'mobile.person.index'))),
            'token'        => $token,
        ]);
    }


    public function loginByCompany(AuthValidatorRequest $request)
    {
//        if (!$this->geetestService->checkGeetest(config('aix.system.site_safety.site_vo_code.members_login'))) {
//            return $this->sendErrorResponse("验证码不通过,请重新验证", ['is_need_geetest' => 1]);
//        }
        if (!$company = $this->authService->loginByCompany(
            $request->company_account,
            $request->company_password,
            $request->autoLogin
        )) {
//            $data['is_need_geetest'] = $this->geetestService->isNeedGeetest(
//                config('aix.system.site_safety.site_vo_code.members_login')
//            );
            $redis                   = Cache::getRedis();
            $value                   = $redis->get('user_' . $request->company_account);
            if (!$value) {
                $value = 0;
            }
            if ($value >= 5) {
                $redis->expire('user_' . $request->company_account, 900);
                return $this->sendErrorResponse("连续登录失败5次,请15分钟后再尝试!");
            }
            $redis->set('user_' . $request->company_account, ++$value);

            return $this->sendErrorResponse("账号或密码错误或密码已超过90天未修改,请使用找回密码功能");
        }
        if ($company->user_status == 0) {
            Auth::guard('web-company')->logout();
            return $this->sendErrorResponse("你的账号处于封禁状态, 请联系管理员");
        }
        $token = CommonService::createToken(2, $company->id);
        return $this->sendSuccessResponse([
            'redirect_url' => url($request->session()->pull('url.intended', route($this->sub_site . 'mobile.firm.index'))),
            'token'        => $token,
        ]);
    }

    public function logout()
    {
        $this->authService->logout();

        return redirect(route($this->sub_site . 'mobile.home'));
    }

    public function loginMZT(){
        if(request()->isMethod('POST')){
            $params = request()->post();
            $member      = Member::where('mobile', '=', $params['user_mobile'])->orderBy('id', 'desc')->first();
            if ($member) {
                //登录
                $this->authService->login($member, 1);
            } else {
                $registerService = new RegisterService();
                // 注册
                $member           = $registerService->registerPerson([
                    'reg_type'      => 1,
                    'mobile'        => $params['user_mobile'],
                    'password'      => '000000',
                    'utype'         => 2,
                    'reg_source'    => 2,
                    'member_status' => 0,
                ]);
                $member->email    = empty($params['user_email']) ? '' : $params['user_email'];
                $member->username = $params['user_name'];
                $member->save();
                $this->authService->login($member, 1);
            }

            return $this->sendSuccessResponse([
                'status' => 1,
                'msg' => '登录成功',
                'url' => route('mobile.home')
            ]);

        }else{
            return view('mobile.app.auth.mzt', ['wap_title' => "闽政通快捷登录"]);
        }
    }




}