package danielcortes.xyz.models.tipo_detalle;

import danielcortes.xyz.data.ConnectionHolder;
import danielcortes.xyz.data.SQLiteConnectionHolder;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class SQLiteTipoDetalleDAO implements TipoDetalleDAO{
  private static final Logger log = LogManager.getLogger(SQLiteTipoDetalleDAO.class);
  private ConnectionHolder connectionHolder;

  public SQLiteTipoDetalleDAO() {
    this.connectionHolder = new SQLiteConnectionHolder();
  }

  public SQLiteTipoDetalleDAO(ConnectionHolder connectionHolder) {
    this.connectionHolder = connectionHolder;
  }

  @Override
  public List<TipoDetalle> getAll() {
    log.debug("Se intentara conseguir todos los tipoDetalle");
    List<TipoDetalle> tipoDetalleList = new ArrayList<>();
    String query = "select * from tipos_detalle";
    try (Connection conn = connectionHolder.getConnection()) {
      try (PreparedStatement ps = conn.prepareStatement(query)) {
        try (ResultSet rs = ps.executeQuery()) {
          while (rs.next()) {
            TipoDetalle tipoDetalle = new TipoDetalle();
            tipoDetalle.setId(rs.getInt("id"));
            tipoDetalle.setNombre(rs.getString("nombre"));
            tipoDetalleList.add(tipoDetalle);
          }
        }
      }
    } catch (SQLException e) {
      log.error("Error al intentar conseguir todos los tipoDetalle", e);
    }
    log.debug("Se consiguieron " + tipoDetalleList.size() + " tipoDetalle");
    return tipoDetalleList;
  }

  @Override
  public Optional<TipoDetalle> getById(int id) {
    log.debug("Se intentara conseguir un TipoDetalle con id " + id);
    TipoDetalle tipoDetalle = null;
    String query = "select * from tipos_detalle where id = ?";
    try (Connection conn = connectionHolder.getConnection()) {
      try (PreparedStatement ps = conn.prepareStatement(query)) {
        ps.setInt(1, id);
        try (ResultSet rs = ps.executeQuery()) {
          if (rs.next()) {
            tipoDetalle = new TipoDetalle();
            tipoDetalle.setId(rs.getInt("id"));
            tipoDetalle.setNombre(rs.getString("nombre"));
          }
        }
      }
    } catch (SQLException e) {
      log.error("Error al intentar conseguir un TipoDetalle con id " + id, e);
    }
    log.debug("Se consiguio el tipoDetalle " + tipoDetalle);
    return Optional.ofNullable(tipoDetalle);
  }

  @Override
  public Optional<TipoDetalle> getByNombre(String nombre) {
    log.debug("Se intentara conseguir un TipoDetalle con nombre" + nombre);
    TipoDetalle tipoDetalle = null;
    String query = "select * from tipos_detalle where nombre = ?";
    try (Connection conn = connectionHolder.getConnection()) {
      try (PreparedStatement ps = conn.prepareStatement(query)) {
        ps.setString(1, nombre);
        try (ResultSet rs = ps.executeQuery()) {
          if (rs.next()) {
            tipoDetalle = new TipoDetalle();
            tipoDetalle.setId(rs.getInt("id"));
            tipoDetalle.setNombre(rs.getString("nombre"));
          }
        }
      }
    } catch (SQLException e) {
      log.error("Error al intentar conseguir un TipoDetalle con nombre " + nombre, e);
    }
    log.debug("Se consigio el TipoDetalle " + tipoDetalle);
    return Optional.ofNullable(tipoDetalle);
  }
}
