<?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:30'],
            'password'            => ['required', 'string', 'min:6', 'max:30'],
            'confirm_password'    => ['same:password'],
            'email'               => ['required', 'string', 'email', 'min:6', 'max:30', 'unique:users'],
            'first_name'          => ['required', 'string', 'max:255'],
            'last_name'           => ['required', 'string', 'max:255'],
            'furigana_first_name' => ['required', 'string', 'max:255'],
            'furigana_last_name'  => ['required', 'string', 'max:255'],
            'post_code'           => ['required', 'min:1', 'max:10'],
            'address'             => ['required', 'string', 'max:255'],
            'address2'            => ['required', 'string', 'max:255'],
            'address3'            => ['required', 'string', 'max:255'],
            'phone_number'        => ['required', 'min:8', 'max:15'],
        ]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $params = $request->all();

        $user = User::create([
            'name'                => $params['name'],
            'username'            => $params['name'],
            'slug'                => $params['name'],
            'password'            => Hash::make($params['password']),
            'email'               => $params['email'],
            'first_name'          => $params['first_name'],
            'last_name'           => $params['last_name'],
            'full_name'           => $params['first_name'] . ' ' . $params['last_name'],
            'furigana_first_name' => $params['furigana_first_name'],
            'furigana_last_name'  => $params['furigana_last_name'],
            'furigana_name'       => $params['furigana_first_name'] . ' ' . $params['furigana_last_name'],
            'post_code'           => $params['post_code'],
            'city'                => $params['address'],
            'address'             => $params['address2'],
            'address2'            => $params['address3'],
            'phone_number'        => $params['phone_number'],
            'avatar'              => 'avatar.png',
            'point'               => 0,
            'is_activated'        => 1,
        ]);

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

        $data = $params;
        $data['site'] = url("/");
        $userEmail = $params['email'];

        try {
            Notify::create([
                'content'      => "[" . $params['full_name'] . "] just registered an account.",
                'module'       => 'register',
                '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());
        } catch (\Exception $exception) {
            logger($exception->getMessage());
        } finally {
            return response()->json(['data' => ['status' => 'success']], 200);
        }

        //Send Email
        //try {
            //hunters2fujiyoshi@gmail.com
            /*Notify::create([
                'content'      => "[" . $params['full_name'] . "] 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) {
                $message->from(config('mail.from.address'), config('mail.from.name'));
                $message->to(config('settings.admin_email'));
                $message->subject("【介護なんでも相談室】お客様から新規会員登録がありました。");
            });*/

            //user
            /*if (config('settings.admin_email') != $userEmail) {
                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("【介護なんでも相談室】新規会員登録ありがとうございました。");
                });
                logger("[Email Registered] Done: " . $userEmail);
            }*/
        //} 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("【介護なんでも相談室】パスワード再設定メール");
        });

        logger("[Email Forgot Password] Done: " . $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);
    }
}
