<?php

namespace App\Http\Middleware;

use App\Models\Artist;
use App\Models\ManagerInvite;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class HasInvitationToken
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\never
     */
    public function handle(Request $request, Closure $next)
    {
        if ($request->isMethod('get')) {
            if (!$request->hasValidSignature()) {
                return abort(401);
            }

            if (!$request->route('token')) {
                return abort(404);
            }

            $invitation_token = $request->route('token');

            $invitations = ManagerInvite::where('email', $request->email)->get();
            foreach($invitations as $invitation) {
                if (Hash::check($invitation_token, $invitation->invitation_token)) {
                    $new_invitation = ManagerInvite::where('invitation_token', $invitation->invitation_token)->firstOrFail();

                    if (Artist::where('user_id', $new_invitation->artist_id)
                                ->whereNotNull('manager_id')
                                ->exists()) {
                        return redirect(route('login'))
                            ->with('error', 'An error occurred. Please try again!');
                    }

                    if (is_null($new_invitation)) {
                        return redirect(route('login'))
                            ->with('error', 'An error occurred. Please try again!');
                    }

                    if (!is_null($new_invitation->registered_at)) {
                        return redirect(route('login'))
                            ->with('error', 'The invitation link has already been used');
                    }

                    $request->merge(['artist_id' => $new_invitation->artist_id]);
                }
            }
        }

        return $next($request);
    }
}
