package db;

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

/**
 * Verwaltet die Nutzer-Tabelle in der SQLite-Datenbank.
 * Bietet Methoden, um alle Nutzer zu laden, neue anzulegen und einzelne zu löschen.
 */
public class UserDAO {

    private final String dbPath;

    public UserDAO(String dbPath) {
        this.dbPath = dbPath;
    }

    public List<String[]> getAllUsers() {
        List<String[]> users = new ArrayList<>();
        String sql = "SELECT phaccount, name FROM users ORDER BY name ASC";

        try (Connection conn = DriverManager.getConnection("jdbc:sqlite:" + dbPath);
             PreparedStatement stmt = conn.prepareStatement(sql);
             ResultSet rs = stmt.executeQuery()) {

            while (rs.next()) {
                users.add(new String[] { rs.getString("phaccount"), rs.getString("name") });
            }

        } catch (SQLException e) {
            System.err.println("Fehler beim Laden der Nutzer: " + e.getMessage());
        }

        return users;
    }

    /**
     * Prüft, ob ein Nutzer mit diesem Kürzel existiert.
     */
    public boolean userExists(String phaccount) {
        String sql = "SELECT 1 FROM users WHERE phaccount = ? LIMIT 1";
        try (Connection conn = DriverManager.getConnection("jdbc:sqlite:" + dbPath);
             PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setString(1, phaccount);
            try (ResultSet rs = stmt.executeQuery()) {
                return rs.next();
            }
        } catch (SQLException e) {
            System.err.println("Fehler bei userExists: " + e.getMessage());
            return false;
        }
    }

    /**
     * Aktualisiert den Namen eines bestehenden Nutzers.
     */
    public boolean updateUser(String phaccount, String name) {
        String sql = "UPDATE users SET name = ? WHERE phaccount = ?";
        try (Connection conn = DriverManager.getConnection("jdbc:sqlite:" + dbPath);
             PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setString(1, name);
            stmt.setString(2, phaccount);
            int rows = stmt.executeUpdate();
            return rows == 1;
        } catch (SQLException e) {
            System.err.println("Fehler beim Aktualisieren des Nutzers: " + e.getMessage());
            return false;
        }
    }

    /**
     * Fügt einen neuen Nutzer ein.
     */
    public boolean insertUser(String phaccount, String name) {
        String sql = "INSERT INTO users (phaccount, name) VALUES (?, ?)";
        try (Connection conn = DriverManager.getConnection("jdbc:sqlite:" + dbPath);
             PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setString(1, phaccount);
            stmt.setString(2, name);
            stmt.executeUpdate();
            return true;
        } catch (SQLException e) {
            System.err.println("Fehler beim Einfügen des Nutzers: " + e.getMessage());
            return false;
        }
    }

    /**
     * Speichert Nutzer: Update, falls vorhanden, sonst Insert.
     */
    public boolean saveUser(String phaccount, String name) {
        if (userExists(phaccount)) {
            return updateUser(phaccount, name);
        } else {
            return insertUser(phaccount, name);
        }
    }

    /**
     * Löscht einen Nutzer anhand seines Kürzels/IDs.
     */
    public boolean deleteUser(String phaccount) {
        String sql = "DELETE FROM users WHERE phaccount = ?";
        try (Connection conn = DriverManager.getConnection("jdbc:sqlite:" + dbPath);
             PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setString(1, phaccount);
            int rowsAffected = stmt.executeUpdate();
            return rowsAffected == 1;
        } catch (SQLException e) {
            System.err.println("Fehler beim Löschen des Nutzers: " + e.getMessage());
            return false;
        }
    }
}