<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use App\Models\Order;
use App\Models\Service;
use App\Mail\ChangeEmail;

use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\URL;
use Illuminate\Auth\Events\Registered;
use Illuminate\Support\Facades\Password;
use Illuminate\Validation\Rules\Password as Pass;
use Illuminate\Support\Facades\Auth;
use Illuminate\Notifications\Messages\MailMessage;
use Mail;

use Stripe\Stripe;
use Stripe\Customer;

class UserController extends Controller
{
	public function create(Request $request) {
		$validated = $request->validate([
			'name' => 'required|max:30',
			'email' => 'required|email|unique:users|max:255',
			'password' => ['required', 'confirmed',
			        Pass::min(8)
			        ->letters()
			        ->mixedCase()
			        ->numbers()
			        ->symbols()
			    ],
		]);

		$user = new User;
		$user->name = $request->name;
		$user->email = $request->email;
		$user->role = "client";
		$user->active = true;
		$user->password = Hash::make($request->password);
		$user->save();

		Auth::login($user);
		event(new Registered($user));
	}

	public function forgotPassword(Request $request) {
		$request->validate(['email' => 'required|email']);

		$status = Password::sendResetLink(
			$request->only('email')
		);
	}

	public function resetPassword(Request $request) {
		$request->validate([
		'token' => 'required',
		'email' => 'required|email',
		'password' => 'required|min:8|confirmed',
		]);

		$status = Password::reset(
		$request->only('email', 'password',
		'password_confirmation', 'token'),
		function ($user, $password) use ($request) {
			$user->forceFill([ 
				'password' => Hash::make($password) 
		])->setRememberToken(Str::random(60));
		});
		if ($status == Password::PASSWORD_RESET) {
			return response()->json([
				"status" => "success"
			]);
		}
	}

	public function login(Request $request) {
		$credentials = $request->only('email', 'password');

		//This should probably be changed to not return a page
		if (Auth::attempt($credentials)) {
			$request->session()->regenerate();
			$this->clearPaying();
		} else {
			abort(401);
		}
	}

	public function logout(Request $request) {
		Auth::logout();
		$request->session()->invalidate();
		$request->session()->regenerateToken();
		return redirect('/');
	}

	//It should have an orderBy clause to make sure the most recent are first
	//This should limit non pending orders to 50. Should also return a json of all services
	public function getOrders(Request $request) {
		return Auth::user()->orders()->with('service')->withCasts(['updated_at'
			=> 'datetime:d-m-Y'])->latest()->limit(100)->get();
	}

	public function changeName(Request $request) {
		$validated = $request->validate([
			'name' => 'required|max:30'
		]);
		$user = Auth::user();
		$user->name = $request->name;
		$user->save();
		return $user;
	}

	public function changeEmail(Request $request) {
		$validated = $request->validate([
			'email' => 'required|email|unique:users,email',
		]);

		$link = URL::temporarySignedRoute('reset-email', now()->addDays(30),
		['user' => Auth::user()->id, 'email' => $request->email]);

		Mail::to($request->email)->send(new ChangeEmail(Auth::user()->email,
			$link));


	}

	public function resetEmail(Request $request) {

		if (! $request->hasValidSignature()) {
			abort(401);
		}

		$validated = $request->validate([
			'email' => 'required|email|unique:users,email',
		]);

		if (! $validated) {
			abort(401);
		}

		$user = User::find($request->user);
		$user->email = $request->email;
		$user->save();

		return view('email-changed');
	}

	public function changePassword(Request $request) {
		$validated = $request->validate([
			'current_password' => 'password',
			'password' => 'required|confirmed|min:8|regex:/.*[a-z].*/|regex:/.*[A-Z].*/|regex:/.*[0-9].*/'
		]);

		$user = Auth::user();
		$user->password = Hash::make($request->password);
		$user->save();
	}

	public function clearPaying() {
		$user = Auth::user();
		if ($user->paying) {
			$user->paying = false;
			$user->save();
		}
	}

}