<?php

namespace App\Repositories;

use App\Models\Ecoponto;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;

class EcopontoRepository
{
    public function listar(array $filtros): LengthAwarePaginator
    {
        $query = Ecoponto::query();

        if (!empty($filtros['status'])) {
            $query->where('status', $filtros['status']);
        }
        if (!empty($filtros['tipo_residuo'])) {
            $query->whereJsonContains('tipos_residuo', $filtros['tipo_residuo']);
        }
        if (!empty($filtros['cidade'])) {
            $query->where('endereco', 'like', '%' . $filtros['cidade'] . '%');
        }

        return $query->orderBy('nome')->paginate(20);
    }

    public function proximos(float $lat, float $lng, float $raioKm, array $filtros): LengthAwarePaginator
    {
        $haversineExpr = "(6371 * acos(
            cos(radians({$lat})) * cos(radians(latitude))
            * cos(radians(longitude) - radians({$lng}))
            + sin(radians({$lat})) * sin(radians(latitude))
        ))";

        $query = Ecoponto::query()
            ->select('ecopontos.*', DB::raw("{$haversineExpr} AS distancia_km"))
            ->where('status', 'ativo')
            ->whereRaw("{$haversineExpr} <= {$raioKm}")
            ->orderBy('distancia_km');

        if (!empty($filtros['tipo_residuo'])) {
            $query->whereJsonContains('tipos_residuo', $filtros['tipo_residuo']);
        }

        return $query->paginate(20);
    }

    public function buscarPorId(int $id): Ecoponto
    {
        return Ecoponto::withCount('doacoes')->findOrFail($id);
    }

    public function criar(array $dados): Ecoponto
    {
        return Ecoponto::create($dados);
    }

    public function atualizar(Ecoponto $ecoponto, array $dados): Ecoponto
    {
        $ecoponto->update($dados);
        return $ecoponto->fresh();
    }

    public function deletar(Ecoponto $ecoponto): void
    {
        $ecoponto->delete();
    }
}
