<?php

namespace App\Http\Controllers;

use App\Enum\UserType;
use App\Models\Artist;
use App\Models\ArtistType;
use App\Models\Genre;
use App\Models\Organizer;
use App\Providers\RouteServiceProvider;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Facades\Auth;
use Exception;

class OnboardingController extends Controller
{
    public function __construct()
    {
        $this->middleware(['auth', 'verified']);
    }

    /**
     * @return Application|Factory|View|RedirectResponse|Redirector|\never
     */
    public function index()
    {
        if (!empty(Auth::user()->type)) {
            switch (Auth::user()->type) {
                case UserType::ARTIST->value:
                    $artist = Artist::where('user_id', Auth::id())->firstOrFail();

                    if ($artist->isOnboardingCompleted()) {
                        return redirect(RouteServiceProvider::ARTIST_HOME);
                    }
                    return view('onboarding.artist.index')
                        ->with('artist', $artist)
                        ->with('types', ArtistType::all())
                        ->with('genres', Genre::all());

                case UserType::ORGANIZER->value:
                    $organizer = Organizer::where('user_id', Auth::id())->firstOrFail();

                    if ($organizer->isOnboardingCompleted()) {
                        return redirect(RouteServiceProvider::ARTIST_HOME);
                    }
                    return view('onboarding.organizer.index')
                        ->with('organizer', $organizer);
            }
        }

        return abort(404);
    }

    /**
     * @param Request $request
     * @return Application|RedirectResponse|Redirector|\never
     */
    public function create(Request $request)
    {
        if (!empty(Auth::user()->type)) {
            switch (Auth::user()->type) {
                case UserType::ARTIST->value:
                    $artist = Artist::where('user_id', Auth::id())->firstOrFail();

                    if ($request->has('birth_date')) {
                        $artist->birth_date = $request->input('birth_date');
                    }
                    if ($request->has('city')) {
                        $artist->city = $request->input('city');
                    }
                    if ($request->has('country')) {
                        $artist->country = $request->input('country');
                    }
                    if ($request->has('short_description')) {
                        $artist->short_description = $request->input('short_description');
                    }
                    if ($request->has('artist_type')) {
                        $type = ArtistType::where('name', $request->input('artist_type'))->firstOrFail();
                        $artist->artist_type()->associate($type);
                    }
                    if ($request->has('genres')) {
                        foreach ($request->input('genres') as $genre) {
                            Genre::findOrFail($genre);
                        }
                        $artist->genres()->attach($request->input('genres.*'));
                    }

                    try {
                        $artist->save();
                    } catch (Exception $e) {
                        return redirect()->back()
                            ->with('error', $e->getMessage());
                    }

                    $artist->user()->associate(Auth::user());

                    return redirect(RouteServiceProvider::ARTIST_HOME);
                case UserType::ORGANIZER->value:
                    $organizer = Organizer::where('user_id', Auth::id())->firstOrFail();

                    if ($request->has('city')) {
                        $organizer->city = $request->input('city');
                    }
                    if ($request->has('country')) {
                        $organizer->country = $request->input('country');
                    }

                    $organizer->user()->associate(Auth::user());

                    try {
                        $organizer->save();
                    } catch (Exception $e) {
                        return redirect()->back()
                            ->with('error', $e->getMessage());
                    }

                    return redirect(RouteServiceProvider::ORGANIZER_HOME);
            }
        }

        return abort(404);
    }
}
