package jumapacelaya.gob.mx.appmovcom.controlador;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import io.micronaut.http.HttpResponse;
import io.micronaut.http.annotation.*;
import jumapacelaya.gob.mx.appmovcom.dto.activarPredioDTO;
import jumapacelaya.gob.mx.appmovcom.dto.adeudoDTO;
import jumapacelaya.gob.mx.appmovcom.dto.adeudoTotalDTO;
import jumapacelaya.gob.mx.appmovcom.dto.asociarServicioDTO;
import jumapacelaya.gob.mx.appmovcom.dto.autentificaDTO;
import jumapacelaya.gob.mx.appmovcom.dto.autentificaRequest;
import jumapacelaya.gob.mx.appmovcom.dto.credencialUsuarioDTO;
import jumapacelaya.gob.mx.appmovcom.dto.eliminarServicioDTO;
import jumapacelaya.gob.mx.appmovcom.dto.referenciaDTO;
import jumapacelaya.gob.mx.appmovcom.dto.servicioAsociadoDTO;
import jumapacelaya.gob.mx.appmovcom.servicio.AppMovComServicio;
import jumapacelaya.gob.mx.appmovcom.dto.historialConsumoDTO;
import jumapacelaya.gob.mx.appmovcom.dto.historialConsumoRequest;
import jumapacelaya.gob.mx.appmovcom.dto.mostrarServicioRequest;
import jumapacelaya.gob.mx.appmovcom.dto.nuevaPswdDTO;
import jumapacelaya.gob.mx.appmovcom.dto.nuevoUsuarioDTO;
import jumapacelaya.gob.mx.appmovcom.dto.predioInfoDTO;
import jumapacelaya.gob.mx.appmovcom.dto.recuperaUsuarioDTO;

@Controller("/appmovcom")
public class AppMovComControlador {

    private final AppMovComServicio servicio;

    public AppMovComControlador(AppMovComServicio servicio) {
        this.servicio = servicio;
    }

    @Get("/validarreferencia/{referencia}")
    public referenciaDTO validarReferencia(@PathVariable String referencia) {
        return servicio.validarReferencia(referencia);
    }

    @Get("/adeudototal/{predioid}")
    public adeudoTotalDTO obtenerAdeudoTotal(@PathVariable Long predioid) {
        return servicio.obtenerAdeudoTotal(predioid);
    }

    @Post("/historialconsumovv")
    public List<historialConsumoDTO> obtenerHistorialConsumo(@Body historialConsumoRequest request) {
        return servicio.obtenerHistorialConsumo(
            request.getPredioid(),
            request.getNumperiodos()
        );
    }

    @Post("/serviciosasociados/{usuarioid}")
    public List<servicioAsociadoDTO> obtenerServiciosAsociados(
        @PathVariable String usuarioid,
        @Body List<credencialUsuarioDTO> credenciales
    ) {
        return servicio.obtenerServiciosAsociados(
            usuarioid
        );
    }

    @Post("/autenticarcredenciales")
    public autentificaDTO autenticarUsuario(@Body autentificaRequest request) {
        return servicio.autenticarUsuario(
            request.getUsr(),
            request.getPswd()
        );
    }

    @Get("/getPredioInfo/{predioid}")
    public List<predioInfoDTO> getPredioInfo(@PathVariable Long predioid) {
        return servicio.getPredioInfo(predioid);
    }

    @Post("/mostrarservicio/{usuarioid}")
    public Map<String, Object> mostrarServicio(@PathVariable String usuarioid,
                                            @Body mostrarServicioRequest request) {
        return servicio.mostrarServicio(usuarioid, request);
    }

    @Get("/adeudord/{predioid}")
    public List<adeudoDTO> obtenerAdeudo(@PathVariable Long predioid) {
        return servicio.obtenerAdeudo(predioid);
    }

    @Post(uri = "/recuperausuariovv")
    public HttpResponse<?> recuperarUsuario(@Body recuperaUsuarioDTO dto) {
        Map<String, Object> resultado = servicio.recuperarUsuario(dto.getEmail(), dto.getPswd());
        return HttpResponse.ok(resultado);
    }

    @Post("/cambiapswdvv")
    public HttpResponse<?> cambiarPassword(@Body nuevaPswdDTO dto) {
        Map<String, Object> respuesta = servicio.cambiarPassword(dto.getEmail(), dto.getPswdchng());
        return HttpResponse.ok(respuesta);
    }

    @Post("/actualizarPredio")
    public HttpResponse<?> actualizarPredio(@Body activarPredioDTO dto) {
        try {
            Map<String, Object> resultado = servicio.actualizarPredio(dto.getPredioid(), dto.getUsuarioid());
            return HttpResponse.ok(resultado);
        } catch (Exception e) {
            return HttpResponse.serverError(
                Collections.singletonMap("message", "Error al actualizar el predio: " + e.getMessage())
            );
        }
    }

    @Post("/eliminaservicio/{usuarioid}")
    public HttpResponse<?> eliminarServicio(@PathVariable String usuarioid,
                                            @Body eliminarServicioDTO dto) {
        if (!usuarioid.equals(dto.getUsr())) {
            Map<String, Object> error = new HashMap<>();
            error.put("status", "500");
            error.put("message", "No se pudo eliminar el servicio seleccionado");
            error.put("data", Map.of("Usuario", usuarioid));
            return HttpResponse.serverError(error);
        }

        servicio.eliminarServicio(usuarioid, dto.getPredioid(), dto.getClienteid(), dto.getContrato());

        Map<String, Object> response = new HashMap<>();
        response.put("status", "200");
        response.put("message", "Servicio eliminado");
        response.put("data", usuarioid + " su predio: " + dto.getPredioid() + " se ha eliminado, ya no lo podrás visualizar en el Dashboard.");
        return HttpResponse.ok(response);
    }

    @Post("/asociarservicio")
    public HttpResponse<?> asociarServicio(@Body asociarServicioDTO dto) {
        Map<String, Object> result = servicio.asociarServicio(dto);
        return HttpResponse.ok(result);
    }

    @Put("/appmovcom/guardausuario/{usuarioid}")
    public HttpResponse<?> guardaUsuarioNuevo(
            @PathVariable String usuarioid,
            @Body List<nuevoUsuarioDTO> usuarios) {

        for (nuevoUsuarioDTO usuario : usuarios) {
            if (usuarioid.equals(usuario.getUsr())) {
                Map<String, Object> resultado = servicio.nuevoUsuario(
                    usuario.getUsr(),
                    usuario.getEmail(),
                    usuario.getPswd(),
                    usuario.getNombre()
                );
                return HttpResponse.ok(resultado);
            }
        }

        return HttpResponse.serverError(Collections.singletonMap(
            "message", "No se pudo guardar el usuario " + usuarioid));
    }
                                                                                                                     
}
