<?php

namespace App\Services;

use App\Models\PontoTuristico;
use App\Models\PontoTuristicoImagem;
use App\Repositories\PontoTuristicoRepository;
use Illuminate\Http\UploadedFile;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\Storage;

class PontoTuristicoService
{
    public function __construct(
        private readonly PontoTuristicoRepository $repository,
        private readonly ProximidadeService       $proximidade,
    ) {}

    public function listar(array $filtros): LengthAwarePaginator
    {
        return $this->repository->listar($filtros);
    }

    public function proximos(float $lat, float $lng, float $raioKm, array $filtros): LengthAwarePaginator
    {
        return $this->repository->proximos($lat, $lng, $raioKm, $filtros);
    }

    public function buscarPorId(int $id, ?int $userId = null): PontoTuristico
    {
        return $this->repository->buscarComDetalhes($id, $userId);
    }

    public function criar(array $dados, int $criadoPor): PontoTuristico
    {
        $dados['criado_por'] = $criadoPor;
        return $this->repository->criar($dados);
    }

    public function atualizar(PontoTuristico $ponto, array $dados): PontoTuristico
    {
        return $this->repository->atualizar($ponto, $dados);
    }

    public function deletar(PontoTuristico $ponto): void
    {
        $this->repository->deletar($ponto);
    }

    public function adicionarImagem(PontoTuristico $ponto, UploadedFile $arquivo): PontoTuristicoImagem
    {
        $path = $arquivo->store('pontos-turisticos', 'public');
        $url  = Storage::url($path);
        $ordem = $ponto->imagens()->count() + 1;

        return $ponto->imagens()->create([
            'path'  => $path,
            'url'   => $url,
            'ordem' => $ordem,
        ]);
    }

    public function removerImagem(PontoTuristico $ponto, int $imagemId): void
    {
        $imagem = $ponto->imagens()->findOrFail($imagemId);
        Storage::disk('public')->delete($imagem->path);
        $imagem->delete();
    }

    public function comoChegar(PontoTuristico $ponto, float $latOrigem, float $lngOrigem): array
    {
        $distanciaKm = $this->proximidade->distanciaKm($latOrigem, $lngOrigem, $ponto->latitude, $ponto->longitude);
        $tempo = $this->proximidade->tempoEstimadoMinutos($distanciaKm);

        return [
            'distancia_km'            => round($distanciaKm, 2),
            'tempo_estimado_minutos'  => $tempo,
            'maps_url'                => "https://maps.google.com/?daddr={$ponto->latitude},{$ponto->longitude}",
        ];
    }
}
