package jumapacelaya.gob.mx.qr.controlador;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import io.micronaut.http.HttpResponse;
import io.micronaut.http.annotation.Body;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.PathVariable;
import io.micronaut.http.annotation.Post;
import jakarta.inject.Inject;
import jumapacelaya.gob.mx.qr.dto.OtInapamDTO;
import jumapacelaya.gob.mx.qr.dto.accionPredioDTO;
import jumapacelaya.gob.mx.qr.dto.pagoQrDTO;
import jumapacelaya.gob.mx.qr.dto.predioQrDTO;
import jumapacelaya.gob.mx.qr.dto.turnoDTO;
import jumapacelaya.gob.mx.qr.servicio.QrServicio;
import io.micronaut.http.MediaType;

@Controller("/qr")
public class QrControlador {

    @Inject
    QrServicio servicio;

    @Get("/consupredio/{nomcte}/{calle}/{numext}")
    public HttpResponse<List<predioQrDTO>> consupredio(String nomcte, String calle, String numext) {
        List<predioQrDTO> resultados = servicio.buscarPredios(nomcte, calle, numext);
        return HttpResponse.ok(resultados);
    }

    @Post("/consupredio/acc")
    public HttpResponse<accionPredioDTO> consuPredioAccion(@Body accionPredioDTO dto) {
        String inapam = servicio.buscarINAPAMPorPredio(dto.getPredioid());
        dto.setInapam(inapam);
        return HttpResponse.ok(dto);
    }

    @Get("/consupredio/{predioid}")
    public HttpResponse<Map<String, Object>> obtenerPredioPorId(@PathVariable Long predioid) {
        Map<String, Object> respuesta = new HashMap<>();
        respuesta.put("predioid", predioid);
        return HttpResponse.ok(respuesta);
    }

    @Post("/consupredio/otinapam")
    public HttpResponse<?> generarOtInapam(@Body OtInapamDTO dto) {
        try {
            String mensaje = servicio.generarOtInapam(
                dto.getPredioid(),
                dto.getDireccion(),
                dto.getObservacion()
            );

            return HttpResponse.ok(new LinkedHashMap<>() {{
                put("mensaje", mensaje);
                put("predioid", dto.getPredioid());
                put("nomcte", dto.getNomcte());
                put("direccion", dto.getDireccion());
                put("obs", dto.getObservacion());
            }});
        } catch (Exception e) {
            return HttpResponse.serverError(new LinkedHashMap<>() {{
                put("error", e.getMessage());
            }});
        }
    }

    @Get(uri = "/pagoqr/{predioid}/{pagoid}", produces = MediaType.APPLICATION_JSON)
    public Optional<pagoQrDTO> obtenerPagoQr(@PathVariable Long predioid, @PathVariable String pagoid) {
        return servicio.obtenerPagoQr(predioid, pagoid);
    }

    @Get("/turnos/{puntoid}")
    public HttpResponse<List<turnoDTO>> obtenerTurnos(@PathVariable int puntoid) {
        List<turnoDTO> turnos = servicio.obtenerTurnosPorPunto(puntoid);
        return HttpResponse.ok(turnos);
    }
}
