import java.util.Locale;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.RowFilter;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 * Panel tabel kontak: JTable di dalam JScrollPane.
 * Panel memasang TableRowSorter agar pencarian bisa menyaring baris
 * yang tampil tanpa mengubah data pada model.
 */
public class PanelTabelKontak extends JScrollPane {

    private final JTable tabel;
    private final TableRowSorter<TableModel> sorter;

    public PanelTabelKontak(KontakTableModel model) {
        super();
        tabel = new JTable(model);
        tabel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        sorter = new TableRowSorter<>(model);
        tabel.setRowSorter(sorter);
        setViewportView(tabel);
    }

    /** Tabel yang dipakai panel — pembacaan nilai lewat view ini. */
    public JTable tabel() {
        return tabel;
    }

    /** Id kontak pada baris terpilih, atau -1 bila tidak ada yang terpilih. */
    public int idTerpilih() {
        int barisTampil = tabel.getSelectedRow();
        if (barisTampil < 0) {
            return -1;
        }
        int barisModel = tabel.convertRowIndexToModel(barisTampil);
        return (int) tabel.getModel().getValueAt(barisModel, 0);
    }

    /** Menandai baris model tertentu pada tampilan. */
    public void pilihBaris(int barisModel) {
        int barisTampil = tabel.convertRowIndexToView(barisModel);
        if (barisTampil >= 0) {
            tabel.setRowSelectionInterval(barisTampil, barisTampil);
        } else {
            tabel.clearSelection();
        }
    }

    /**
     * Menyaring baris yang tampil dengan kata kunci pada kolom nama,
     * email, atau telepon. Kata kunci kosong menghapus saringan.
     */
    public void saring(String kataKunci) {
        String kunci = kataKunci == null ? "" : kataKunci.strip();
        if (kunci.isEmpty()) {
            sorter.setRowFilter(null);
            return;
        }
        sorter.setRowFilter(new RowFilter<TableModel, Integer>() {
            @Override
            public boolean include(Entry<? extends TableModel, ? extends Integer> entri) {
                for (int kolom = 1; kolom < entri.getValueCount(); kolom++) {
                    if (entri.getStringValue(kolom)
                            .toLowerCase(Locale.ROOT).contains(kunci)) {
                        return true;
                    }
                }
                return false;
            }
        });
    }
}
