package examenes.examen20250509.controlador;

import examenes.examen20250509.modelo.Concierto;
import examenes.examen20250509.modelo.Grupo;
import examenes.examen20250509.modelo.Sala;


import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class ControladorConcierto {
    public static Concierto getFirstConcierto() {
        Connection conn = GestorConexiones.getConnection();
        try {
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery("select * from concierto limit 1");

            rs.next();
            return new Concierto(
                    rs.getInt("id"),
                    rs.getDate("fecha"),
                    rs.getFloat("precio"),
                    rs.getBoolean("es_festival"),
                    rs.getInt("sala_id"),
                    rs.getInt("grupo_id")
            );
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public static Concierto getLastConcierto() {
        Connection conn = GestorConexiones.getConnection();
        try {
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery("select * from concierto order by id desc limit 1");

            rs.next();
            return new Concierto(
                    rs.getInt("id"),
                    rs.getDate("fecha"),
                    rs.getFloat("precio"),
                    rs.getBoolean("es_festival"),
                    rs.getInt("sala_id"),
                    rs.getInt("grupo_id")
            );
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public static Concierto getSiguienteConcierto(Concierto c) {
        Connection conn = GestorConexiones.getConnection();
        try {
            PreparedStatement pt = conn.prepareStatement("SELECT * FROM concierto WHERE id > ? LIMIT 1");
            pt.setInt(1, c.getId());
            ResultSet rs = pt.executeQuery();

            rs.next();
            return new Concierto(
                    rs.getInt("id"),
                    rs.getDate("fecha"),
                    rs.getFloat("precio"),
                    rs.getBoolean("es_festival"),
                    rs.getInt("sala_id"),
                    rs.getInt("grupo_id")
            );
        } catch (SQLException e) {
            return c;
            //throw new RuntimeException(e);
        }
    }

    public static Concierto getAnteriorConcierto(Concierto c) {
        Connection conn = GestorConexiones.getConnection();
        try {
            PreparedStatement pt = conn.prepareStatement("SELECT * FROM concierto WHERE id < ? ORDER BY id DESC LIMIT 1");
            pt.setInt(1, c.getId());
            ResultSet rs = pt.executeQuery();

            rs.next();
            return new Concierto(
                    rs.getInt("id"),
                    rs.getDate("fecha"),
                    rs.getFloat("precio"),
                    rs.getBoolean("es_festival"),
                    rs.getInt("sala_id"),
                    rs.getInt("grupo_id")
            );
        } catch (SQLException e) {
            return c;
            //throw new RuntimeException(e);
        }
    }


    public static int guardarConcierto(Concierto c) {
        if (c.getId() == -1) {
            return nuevoConcierto(c);
        } else {
            Connection conn = GestorConexiones.getConnection();
            try {
                PreparedStatement pt = conn.prepareStatement("UPDATE concierto SET fecha = ? , precio = ? , es_festival = ?, sala_id = ?, grupo_id = ? WHERE id = ?");
                pt.setDate(1, new Date(c.getFecha().getTime()));
                pt.setFloat(2, c.getPrecio());
                pt.setBoolean(3, c.isEs_festival());
                pt.setInt(4, c.getSala_id());
                pt.setInt(5, c.getGrupo_id());
                pt.setInt(6, c.getId());
                return pt.executeUpdate();

            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }


    public static List<Concierto> filtrarConciertos(Sala s, String grupo) {
        Connection conn = GestorConexiones.getConnection();
        List<Concierto> conciertos = new ArrayList<>();
        try {
            PreparedStatement pt = conn.prepareStatement("SELECT c.* FROM concierto c join grupo g on c.grupo_id = g.id where c.sala_id = ? and g.nombre like ?");
            pt.setInt(1, s.getId());
            pt.setString(2, "%" + grupo + "%");
            ResultSet rs = pt.executeQuery();

            while (rs.next()) {
                conciertos.add(new Concierto(
                        rs.getInt("id"),
                        rs.getDate("fecha"),
                        rs.getFloat("precio"),
                        rs.getBoolean("es_festival"),
                        rs.getInt("sala_id"),
                        rs.getInt("grupo_id")));
            }
            return conciertos;

        } catch (SQLException e) {
            return conciertos;
            //throw new RuntimeException(e);
        }
    }

    public static int obtenerRecuentoFestivalesPorCiudad(String ciudad) {
        Connection conn = GestorConexiones.getConnection();
        try {
            PreparedStatement pt = conn.prepareStatement("select count(*) recuento from concierto c join sala s on c.sala_id = s.id where c.es_festival = 1 and s.ciudad = ?");
            pt.setString(1, ciudad);
            ResultSet rs = pt.executeQuery();

            rs.next();

            return rs.getInt("recuento");

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public static float calcularPrecioMedio() {
        Connection conn = GestorConexiones.getConnection();
        try {
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery("select avg(c.precio) media from concierto c");

            rs.next();

            return rs.getFloat("media");

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public static int nuevoConcierto(Concierto c) {
        Connection conn = GestorConexiones.getConnection();
        try {

            PreparedStatement pt = conn.prepareStatement("INSERT INTO concierto (id,fecha,precio,es_festival,sala_id,grupo_id) VALUES (?,?,?,?,?,?)");
            pt.setInt(1, getLastConcierto().getId() + 1);
            pt.setDate(2, new Date(c.getFecha().getTime()));
            pt.setFloat(3, c.getPrecio());
            pt.setBoolean(4, c.isEs_festival());
            pt.setInt(5, c.getSala_id());
            pt.setInt(6, c.getGrupo_id());

            return pt.executeUpdate();

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public static int borrarConcierto(Concierto c) {
        Connection conn = GestorConexiones.getConnection();
        try {
            PreparedStatement pt = conn.prepareStatement("DELETE FROM concierto WHERE id = ?");
            pt.setInt(1, c.getId());
            return pt.executeUpdate();
        } catch (SQLException e) {
            return 0;
            //throw new RuntimeException(e);
        }
    }

}
