package tutorialJava.examenes.examen20250509.controlador;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import tutorialJava.examenes.examen20250509.modelo.Concierto;

public class ControladorConcierto {
	
	public static Concierto getPrimero () {
		Concierto c = getConciertoDesdeSql("select * from concierto "
				+ "order by id asc limit 1");
		return c;
	}
	
	public static Concierto getSiguiente (int idActual) {
		Concierto c = getConciertoDesdeSql("select * from concierto "
				+ "where id > " + idActual + " order by id asc limit 1");
		return c;
	}
	
	public static Concierto getUltimo () {
		Concierto c = getConciertoDesdeSql("select * from concierto "
				+ "order by id desc limit 1");
		return c;
	}
	
	public static Concierto getAnterior (int idActual) {
		Concierto c = getConciertoDesdeSql("select * from concierto "
				+ "where id < " + idActual + " order by id desc limit 1");
		return c;
	}
	
	
	public static Concierto getConciertoDesdeSql (String sql) {
		Concierto c = null;
		try {
			Connection conn = ConnectionManager.getConnection();
			Statement s = conn.createStatement();
			ResultSet rs = s.executeQuery(sql);
			if (rs.next()) {
				c = new Concierto();
				c.setId(rs.getInt("id"));
				c.setFecha(rs.getDate("fecha"));
				c.setPrecio(rs.getFloat("precio"));
				c.setFestival(rs.getBoolean("es_festival"));
				c.setIdGrupo(rs.getInt("grupo_id"));
				c.setIdSala(rs.getInt("sala_id"));
				return c;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return c;
	}

	/**
	 * 
	 * @param c
	 * @return
	 */
	public static int guardar (Concierto c) {
		if (c.getId() > 0) {
			return modificar(c);
		}
		else if (c.getId() == 0){ // Inserción del dato
			return insertar(c);
		}
		return 0;
	}
	
	/**
	 * 
	 * @param c
	 */
	public static int modificar(Concierto c) {
		int registroAfectados = 0;
		try {
			Connection conn = ConnectionManager.getConnection();
			PreparedStatement ps = conn.prepareStatement(
					"update concierto set fecha= ? "
					+ ", precio= ?, es_festival = ?, "
					+ "sala_id = ?, grupo_id = ? "
					+ "where id = ?");
			long millisFecha = c.getFecha().getTime();
			ps.setDate(1, new java.sql.Date(millisFecha));
			ps.setFloat(2, c.getPrecio());
			ps.setBoolean(3, c.isFestival());
			ps.setInt(4, c.getIdSala());
			ps.setInt(5, c.getIdGrupo());
			ps.setInt(6, c.getId());
			registroAfectados = ps.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return registroAfectados;
	}

	/**
	 * 
	 * @param c
	 * @return
	 */
	public static int insertar(Concierto c) {
		int registroAfectados = 0;
		try {
			Connection conn = ConnectionManager.getConnection();
			PreparedStatement ps = conn.prepareStatement(
					"insert into concierto "
					+ "(id, fecha, precio, es_festival, sala_id,"
					+ "grupo_id) values (?, ?, ?, ?, ?, ?)");
			long millisFecha = c.getFecha().getTime();
			ps.setInt(1, c.getId());
			ps.setDate(2, new java.sql.Date(millisFecha));
			ps.setFloat(3, c.getPrecio());
			ps.setBoolean(4, c.isFestival());
			ps.setInt(5, c.getIdSala());
			ps.setInt(6, c.getIdGrupo());
			registroAfectados = ps.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return registroAfectados;
	}

	
	 /* 
	 * @param c
	 * @return
	 */
	public static int eliminar(int idConcierto) {
		int registroAfectados = 0;
		try {
			Connection conn = ConnectionManager.getConnection();
			PreparedStatement ps = conn.prepareStatement(
					"delete from concierto where id = ?");
			ps.setInt(1, idConcierto);
			registroAfectados = ps.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return registroAfectados;
	}

	/**
	 * 
	 * @param idSala
	 * @return
	 */
	public static List<String> findConciertosPorSalaYNombreGrupo (
			int idSala, String nombreGrupo) {
		
		List<String> lista = new ArrayList<String>();
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		try {
			Connection conn = ConnectionManager.getConnection();
			PreparedStatement ps = conn.prepareStatement(
					"SELECT c.*, s.nombre as nombre_sala, g.nombre as nombre_grupo "
					+ "FROM concierto c "
					+ "inner join sala s on c.sala_id =  s.id "
					+ "inner join grupo g on c.grupo_id = g.id "
					+ "where c.sala_id = ? "
					+ "and g.nombre like ?");
			ps.setInt(1, idSala);
			ps.setString(2, "%" + nombreGrupo + "%");
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				String fecha = sdf.format(rs.getDate("fecha"));
				String s = fecha + " - " 
						+ rs.getString("nombre_grupo") + " - "
						+ rs.getString("nombre_sala");
				lista.add(s);
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		return lista;
	}
	
	
	
	public static Object[][] getTotalesFestivalesPorCiudad() {
		List<Object[]> list = new ArrayList<Object[]>();
		try {
			Connection conn = ConnectionManager.getConnection();
			Statement s = conn.createStatement();
			ResultSet rs = s.executeQuery("select sala.ciudad as ciudad, "
					+ "count(concierto.id) as festivales "
					+ "from concierto inner join sala "
					+ "on (concierto.sala_id = sala.id) "
					+ "where  concierto.es_festival = 1 "
					+ "group by sala.ciudad;");
			while (rs.next()) {
				Object fila[] = new Object[2];
				fila[0] = rs.getString("ciudad");
				fila[1] = rs.getString("festivales");
				list.add(fila);
			}
		}
		catch (Exception ex) {
			ex.printStackTrace();
		}
		
		// Convierto la lista en una matriz
		Object m[][] = new Object[list.size()][2];
		for (int i = 0; i < list.size(); i++) {
			m[i][0] = list.get(i)[0];
			m[i][1] = list.get(i)[1];	
		}
		
		return m;
	}
	
	
	
	/**
	 * 
	 * @return
	 */
	public static float getPrecioMedioConciertos() {
		try {
			Connection conn = ConnectionManager.getConnection();
			Statement s = conn.createStatement();
			ResultSet rs = 
					s.executeQuery("select avg(precio) from concierto");
			
			if (rs.next()) {
				return rs.getFloat(1);
			}
		}
		catch (Exception ex) {
			ex.printStackTrace();
		}
		return -1;
	}
	
	
	
	/**
	 * 
	 * @return
	 */
	public static String getGrupoConMasConciertos() {
		try {
			Connection conn = ConnectionManager.getConnection();
			Statement s = conn.createStatement();
			ResultSet rs = 
					s.executeQuery("select count(concierto.id) as total, "
							+ "grupo.nombre "
							+ "from concierto inner join grupo "
							+ "on concierto.grupo_id = grupo.id "
							+ "group by grupo.nombre "
							+ "order by total desc limit 1");
			
			if (rs.next()) {
				return rs.getString(2);
			}
		}
		catch (Exception ex) {
			ex.printStackTrace();
		}
		return "Error al obtener el grup con más conciertos";
	}

}















