package mx.gob.jumapacelaya.Services;

import mx.gob.jumapacelaya.models.Predio;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class PredioService {

    private final JdbcTemplate jdbcTemplate;

    public PredioService(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public List<Predio> getInfoPredio(int predioId) {
        List<Predio> infoPredio = new ArrayList<>();
        String query = "Select predioid, clienteid, c.nombre nomcliente, contrato contrato, \n" +
                "        fn_getdomicilio(p.direcid) direccion, fn_get_direccion(p.direcid) direccionmostrar, fn_direccionshort(p.direcid) direccioncorta,\n" +
                "        fn_gettelefono(clienteid) telefono,\n" +
                "        p.coordx, p.coordy, p.zonafactid, p.serialmed, marcamedid||'-'||ma.descripcion marcamed, (decode(mo.descripcion,null,'Desconocido',modelomedid||'-'||mo.descripcion)) modelomed,\n" +
                "        edopredioid, e.nombre edopredio, usoid, u.nombre uso, actividadid, a.nombre actividad, \n" +
                "        regexp_substr(fn_get_tarifa(predioid), '[^¬]+',1,1) tarifaid, regexp_substr(fn_get_tarifa(predioid), '[^¬]+',1,2) tarifa\n " + 
                "        from predios p\n" +
                "        left join clientes c using (clienteid)\n" +
                "        left join estadospredio e using(edopredioid)\n" +
                "        left join usos u using (usoid)\n" +
                "        left join actividades a using (usoid, actividadid)\n" +
                "        left join marcasmedidor ma using(marcamedid)\n" +
                "        left join modelosmedidor mo using(marcamedid, modelomedid)\n" +
                "        where predioid=?";

        return jdbcTemplate.query(query, new Object[]{predioId}, predioRowMapper());
    }

    private RowMapper<Predio> predioRowMapper() {
        return (rs, rowNum) -> new Predio(
                rs.getInt("PREDIOID"),
                rs.getInt("CLIENTEID"),
                rs.getString("NOMCLIENTE"),
                rs.getString("CONTRATO"),
                rs.getString("DIRECCION"),
                rs.getString("DIRECCIONMOSTRAR"),
                rs.getString("DIRECCIONCORTA"),
                rs.getString("TELEFONO"),
                rs.getString("COORDX"),
                rs.getString("COORDY"),
                rs.getString("ZONAFACTID"),
                rs.getString("SERIALMED"),
                rs.getString("MARCAMED"),
                rs.getString("MODELOMED"),
                rs.getString("EDOPREDIOID"),
                rs.getString("EDOPREDIO"),
                rs.getString("USOID"),
                rs.getString("USO"),
                rs.getInt("ACTIVIDADID"),
                rs.getString("ACTIVIDAD"),
                rs.getInt("TARIFAID"),
                rs.getString("TARIFA")
        );
    }
}
