<?php

namespace App\Http\Controllers;

use App\Events\NotifyEvent;
use App\Notify;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use App\Laravue\Models\Role;
use App\Laravue\Models\User;
use Carbon\Carbon;
use Validator;
use Mail;

class RegisterController extends Controller
{
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name'             => ['required', 'string', 'max:255'],
            'phone_number'     => ['required', 'min:6', 'max:30'],
            'email'            => ['required', 'string', 'email', 'max:50', 'unique:users'],
            'password'         => ['required', 'string', 'min:6'], //confirm_password
            'confirm_password' => ['same:password'],
        ]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);

        $params = $request->all();
        $user = User::create([
            'name'           => $params['name'],
            'full_name'      => $params['name'],
            'furigana_name'  => $params['name'],
            'phone_number'   => $params['phone_number'],
            'email'          => $params['email'],
            'password'       => Hash::make($params['password']),
            'avatar'         => 'avatar.png',
            'gender'         => 1,
            'age'            => 1,
            'post_code'      => "",
            'address'        => 'Ha Noi, VN',
            'contact_method' => 1,
        ]);

        $role = Role::findByName('user');
        $user->syncRoles($role);

        //Email
        $ageList = ['1' => '18～24歳', '2' => '25～34歳', '3' => '35～44歳', '4' => '45～54歳', '5' => '55～64歳', '6' => '65歳以上'];
        $contactMethodList = [1 => 'メール', 2 => '電話', 3 => 'ライン', 4 => '当サイトからの連絡は受けとらない'];

        if ($params['gender'] == 1 || $params['gender'] == '1') {
            $gender = '男性';
        } elseif ($params['gender'] == 2 || $params['gender'] == '2') {
            $gender = '非公開';
        } else {
            $gender = '女性';
        }

        $data = $params;
        $data['gender'] = $gender;
        $data['age'] = $ageList[$data['age']];
        $data['contact_method'] = $contactMethodList[$data['contact_method']];
        $data['site'] = url("/");
        $userEmail = $params['email'];
        $textPhone = $params['phone_number'];
        $textPhone = str_replace(" ", "", $textPhone);
        $textPhone = str_replace("-", "", $textPhone);

        $titleEmail = "[AI DATA SYSTEM] Member đăng ký thành viên mới - " . $textPhone;

        try {
            //hunters2fujiyoshi@gmail.com
            Notify::create([
                'content'      => "[" . $params['phone_number'] . "] just registered an account.",
                'module'       => 'contact',
                'item_content' => json_encode($data),
                'created_at'   => date('Y-m-d H:i:s'),
                'updated_at'   => date('Y-m-d H:i:s'),
            ]);
            event(new NotifyEvent()); //broadcast(new NotifyEvent($notify));

            //admin
            Mail::send('emails.register_admin', $data, function ($message) use ($titleEmail) {
                $message->from(config('mail.from.address'), config('mail.from.name'));
                $message->to('duyliemapt@gmail.com'); //$message->to(config('settings.admin_email'));
                $message->subject($titleEmail);
            });

            //user
            /*Mail::send('emails.register_user', $data, function ($message) use ($userEmail) {
                $message->from(config('mail.from.address'), config('mail.from.name'));
                $message->to($userEmail);
                $message->subject("【介護なんでも相談室】新規会員登録ありがとうございました。");
            });*/
        } catch (\Exception $exception) {
            logger($exception->getMessage());
        } finally {
            logger("[Email] Sent register email to: " . config('settings.admin_email'));

            return response()->json(['data' => ['status' => 'success']], 200);
        }
    }

    public function forgotPassword(Request $request) {
	    $validator = Validator::make($request->all(), [
		    'email'            => ['required', 'string', 'email', 'max:255'],
	    ]);
	    if ($validator->fails()) return response()->json(['data' => ['status' => 'error', 'message' => $validator->errors()]], 200);

	    $checkEmail = User::where('email', $request->get('email'))->first();
	    if (!$checkEmail) return response()->json(['data' => ['status' => 'error', 'message' => '電子メールが存在しません。']], 200);

	    $code = md5(md5(rand(1, 9999) . date('YmdHis')));
	    $link = url('/forgot-password/' . $code);
	    $email = $request->get('email');
	    $fullName = $checkEmail->full_name;
	    if ($fullName == "" || $fullName == null) $fullName = $checkEmail->name;
	    $expTime = Carbon::now()->addMinutes(15);

	    $checkEmail->update([
	    	'reset_password_code' => $code,
		    'reset_password_time' => $expTime
	    ]);

	    $data = [
	    	'full_name' => $fullName,
	    	'link'      => $link,
	    ];

	    Mail::send('emails.forgot_password_user', $data, function ($message) use ($email) {
		    $message->from(config('mail.from.address'), config('mail.from.name'));
		    $message->to($email);
		    $message->subject("【介護なんでも相談室】Reset Password Email");
	    });

	    return response()->json(['data' => ['status' => 'success']], 200);
    }

    public function resetPassword(Request $request, $code = '') {
	    $validator = Validator::make($request->all(), [
		    'email'            => ['required', 'string', 'email', 'max:255'],
		    'password'         => ['required', 'string', 'min:6'],
		    'confirm_password' => ['same:password'],
	    ]);
	    if ($validator->fails()) return response()->json(['data' => ['status' => 'error', 'message' => $validator->errors()]], 200);

	    $params = $request->all();
	    $checkEmail = User::where('email', $params['email'])->first();
	    if (!$checkEmail) return response()->json(['data' => ['status' => 'error', 'message' => '電子メールが存在しません。']], 200);

	    $firstDate = Carbon::now();
	    $secondDate = Carbon::parse($checkEmail->reset_password_time);

	    if ($checkEmail->reset_password_code == null ||
		    $checkEmail->reset_password_code == "" ||
		    $checkEmail->reset_password_time == null ||
		    $checkEmail->reset_password_time == "" ||
		    $checkEmail->reset_password_code != $code || $firstDate->gt($secondDate)) {
	    	return response()->json(['data' => ['status' => 'error_exp', 'message' => 'パスワード リセット コードの有効期限が切れています。ここをクリックして、もう一度お試しください。']], 200);
	    }

	    $checkEmail->update([
		    'password'            => Hash::make($params['password']),
		    'reset_password_code' => null,
		    'reset_password_time' => null,
		    'updated_at'          => date('Y-m-d H:i:s')
	    ]);

	    return response()->json(['data' => ['status' => 'success']], 200);
    }
}
