<?php

namespace App\Http\Controllers\Admin;

use App\Http\Requests\ProfileRequest;
use App\Models\Admin;
use App\Models\Persona;
use App\Http\Controllers\Controller;
use App\Http\Requests\AdminRequest;
use App\Http\Resources\Admin\AdminCollection;
use App\Http\Resources\Admin\AdminResource;
use App\Http\Resources\DefaultResource;
use App\Services\UploadedImageService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response as HttpResponse;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;

class AdminController extends Controller
{
    public function index(Request $request)
    {
        $admin_id = null;

        if ($request->user()->getGuard() === 'admin') {
            $admin_id = $request->user()->id;
        }

        $size = request('page.size', 10);
        $page = request('page.number', 1);

        $result = Admin::query()
            ->with('persona', 'persona.image')
            ->select(
                'id',
                'username',
                'email',
                'root',
                'persona_id',
                'estado',
                DB::raw('if(id=' . $admin_id . ',1,0) as yo')
            )
            ->filterLike(request('filter', []))
            ->orderByDesc('id') 
            ->applySorts(request('sort'))
            ->latest()
            ->fastPaginate(
                $size,
                ['username'],
                'page[number]',
                $page
            )
            ->appends(
                $request->only('sort', 'page.size', 'filter')
            );

        /** @param Admin $admin */
        $result->each(function ($admin) {
            $admin->persona->setImageThumbSize('small');
        });

        return AdminCollection::make($result);
    }

    public function store(
        AdminRequest $request,
        UploadedImageService $uploadedImageService,
    ): AdminResource {
        $validated = $request->validated();
        // $persona = Persona::query()
        //     ->firstWhere('cedula', $validated['cedula'] + 'fl');

        // Si la persona no existe, procedemos a crearla.
        // if (\is_null($persona)) {
        $personaData = [
            //'cedula' => $validated['cedula'],
            'nombre' => $validated['nombre'],
            'apellido' => $validated['apellido'],
        ];

        $persona = Persona::create($personaData);

        if ($request->hasFile('imagen')) {
            $imagen = $request->file('imagen');

            $uploadedImageService
                ->setFile($imagen)
                ->setRelatedModel($persona)
                ->move()
                ->createThumbnails()
                ->storeRelationship();
        }
        // }

        $admin_data = [
            'username' => $validated['username'],
            'email' => $validated['email'],
            'password' => Hash::make($validated['password']),
            'persona_id' => $persona->id,
            'estado' => $validated['estado'],
            'root' => $validated['root']
        ];

        $admin = Admin::create($admin_data);

        return AdminResource::make($admin);
    }

    public function update(
        AdminRequest $request,
        Admin $admin,
        UploadedImageService $uploadedImageService,
    ) {
        $validated = $request->validated();

        $adminAttributes = Arr::only($validated, ['username', 'email', 'estado', 'root']);

        if (! empty($validated['password'])) {
            $adminAttributes['password'] = Hash::make($validated['password']);
        }

        $admin
            ->fill($adminAttributes)
            ->save();

        $admin
            ->persona
            ->fill(Arr::except($validated, ['username', 'email', 'imagen', 'password', 'password_confirmation']))
            ->save();

        if ($request->hasFile('imagen')) {
            $imagen = $request->file('imagen');

            $uploadedImageService
                ->setFile($imagen)
                ->setRelatedModel($admin->persona)
                ->move()
                ->createThumbnails()
                ->replaceFirst();
        }

        return AdminResource::make($admin);
    }

    public function show(Admin $admin): AdminResource
    {
        return AdminResource::make($admin);
    }

    public function destroy($id): HttpResponse
    {
        Admin::find($id)->delete();
        return response()->noContent();
    }

    public function myData() //: DefaultResource
    {
        /** @var Admin */
        $user = Auth::user();

        $user->load('persona');
        $user->persona->setImageThumbSize('medium');

        return AdminResource::make($user);

        // return response()->json([
        //     'user_type' => $user->getGuard() === 'admin' ? 2 : 1,
        //     'data' => $user,
        // ]);
    }

    public function updateMyData(
        ProfileRequest $request,
        UploadedImageService $uploadedImageService,
    ): AdminResource|JsonResponse {
        /** @var Admin */
        $user = Auth::user();

        $attributes = $request->all();

        //validamos que la contraseña establecida sea correcta

        /*$credentials = [
            'email' => $user->email,
            'password' => $attributes['validate_password']
        ];*/

        //unset($attributes['validate_password'], $attributes['email']);

        /*if (!Auth::guard('admin')->attempt($credentials)) {
            return response()->json([
                'errors' => [[
                    'status' => (string) 401,
                    'source' => (object) [],
                    'title' => 'Contraseña Inválida',
                    'detail' => 'No se puede guardar los cambios',
                ]]
            ], 401);
        }*/

        /** @var ?Admin */
        $user_data = null;

        switch ($user->getGuard()) {
            case ('admin'):
                /** @var ?Admin */
                $admin = Admin::find($user->id);
                if (! empty($attributes['password'])) {
                    $attributes['password'] = Hash::make($attributes['password']);
                } else {
                    unset($attributes['password']);
                }

                unset($attributes['password_confirmation']);
                $admin?->fill($attributes)->save();
                $user_data = $admin;
                break;
        }

        unset($attributes['imagen'], $attributes['password'], $attributes['password_confirmation']);

        /** @var ?Persona */
        $persona = Persona::find($user->persona_id);
        $persona?->fill($attributes)->save();

        if ($request->hasFile('imagen')) {
            $imagen = $request->file('imagen');

            $uploadedImageService
                ->setFile($imagen)
                ->setRelatedModel($persona)
                ->move()
                ->createThumbnails()
                ->replaceFirst();
        }

        if ($user_data || $persona) {
            $user_data->persona = $persona;

            return AdminResource::make($user_data);
        } else {
            return response()->json([
                'errors' => [[
                    'status' => (string) 422,
                    'source' => (object) [],
                    'title' => 'No se pudo actualizar los datos',
                    'detail' => 'Se mantendrán los cambios',
                ]]
            ], 422);
        }
    }
}
