package ogloszenia.baza.sqlite;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

import ogloszenia.exn.BladBazyDanych;
import ogloszenia.exn.NieznanyRekord;
import ogloszenia.model.Adres;
import ogloszenia.model.Sprzedawca;

public class SprzedawcaDAO {
	private DostepDoBazySqlite db;
	
	SprzedawcaDAO(DostepDoBazySqlite db) {
		this.db = db;
	}
	
	public DostepDoBazySqlite getDBHandler() {
		return db;
	}
	
	public List<Integer> listaIdSprzedawcow() throws BladBazyDanych {
		final String sql = "SELECT id_sprzedawcy FROM sprzedawcy";
		List<Integer> lista = new LinkedList<>();
		try(PreparedStatement stmt = db.c().prepareStatement(sql)) {
			try(ResultSet rs = stmt.executeQuery()) {
				while(rs.next()) {
					lista.add(rs.getInt(1));
				}
			}
		} catch (SQLException e) {
			throw new BladBazyDanych("listaIdSprzedawcow: "+e.getMessage(), e);
		}
		return lista;
	}

	public Sprzedawca byId(int idSprzedawcy) throws BladBazyDanych, NieznanyRekord {
		final String sql = "SELECT * FROM sprzedawcy WHERE id_sprzedawcy = ?";
		try(PreparedStatement stmt = db.c().prepareStatement(sql)) {
			stmt.setInt(1, idSprzedawcy);
			try(ResultSet rs = stmt.executeQuery()) {
				if(rs.next()) {
					return sprzedawcaZResultSet(rs);
				} else {
					throw new NieznanyRekord("Nieznany sprzedawca " + idSprzedawcy);
				}
			}
		} catch (SQLException e) {
			throw new BladBazyDanych("Sprzedawca byId: "+e.getMessage(), e);
		}
	}

	public List<Sprzedawca> readAll() throws BladBazyDanych {
		final String sql = "SELECT * FROM sprzedawcy";
		List<Sprzedawca> lista = new LinkedList<>();
		try(PreparedStatement stmt = db.c().prepareStatement(sql)) {
			try(ResultSet rs = stmt.executeQuery()) {
				while(rs.next()) {
					lista.add(sprzedawcaZResultSet(rs));
				}
			}
		} catch (SQLException e) {
			throw new BladBazyDanych("Sprzedawca readAll: "+e.getMessage(), e);
		}
		return lista;
	}
	
	private Sprzedawca sprzedawcaZResultSet(ResultSet rs) throws SQLException {
		Adres adres = new Adres(rs.getString("ulica"),
				rs.getString("kod_pocztowy"), rs.getString("miasto"));
		
		return new Sprzedawca(
				rs.getInt("id_sprzedawcy"), rs.getString("nazwa"),
				adres, rs.getString("telefon"), rs.getString("email")
			);
	}
}
