<?php

namespace App\Services;

use App\Models\Avaliacao;
use App\Models\PontoTuristico;
use App\Models\Restaurante;
use Illuminate\Validation\ValidationException;

class AvaliacaoService
{
    public function salvar(int $userId, string $tipo, int $id, int $nota, ?string $comentario): Avaliacao
    {
        [$modelClass, $avaliavel] = $this->resolverModel($tipo, $id);

        return Avaliacao::updateOrCreate(
            [
                'user_id'       => $userId,
                'avaliavel_type' => $modelClass,
                'avaliavel_id'  => $id,
            ],
            [
                'nota'       => $nota,
                'comentario' => $comentario,
            ]
        );
    }

    private function resolverModel(string $tipo, int $id): array
    {
        return match ($tipo) {
            'ponto'      => [PontoTuristico::class, PontoTuristico::findOrFail($id)],
            'restaurante' => [Restaurante::class, Restaurante::findOrFail($id)],
            default      => throw ValidationException::withMessages([
                'tipo' => 'Tipo de avaliação inválido. Use "ponto" ou "restaurante".',
            ]),
        };
    }
}
