import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

// Glavni razred za grafični uporabniški vmesnik
public class CestaGUI extends JFrame {
    private CestaTableModel tableModel;  // Model za tabelo cest
    private JTextField imeField;  // Vnosno polje za ime ceste
    private JTextField dolzinaField;  // Vnosno polje za dolžino ceste
    private JTextField stevilkaField;  // Vnosno polje za številko ceste
    private JTextField dodatneField;  // Vnosno polje za dodatne informacije
    private JComboBox<String> vrstaComboBox;  // Spustni meni za vrsto ceste
    private JCheckBox asfaltiranaCheckBox;  // Oznaka za asfaltirane ceste
    private JTextField maxHitrostField;  // Vnosno polje za največjo hitrost
    private JTable table;  // Tabela za prikaz cest

    // Konstruktor za inicializacijo GUI
    public CestaGUI() {
        setTitle("Seznam Cest");  // Nastavi naslov okna
        setSize(700, 400);  // Nastavi velikost okna
        setDefaultCloseOperation(EXIT_ON_CLOSE);  // Nastavi zapiranje okna na izhod programa
        setLayout(new BorderLayout());  // Nastavi razporeditev komponent

        // Inicializacija modela tabele in tabele
        tableModel = new CestaTableModel();
        table = new JTable(tableModel);
        JScrollPane scrollPane = new JScrollPane(table);  // Dodaj scroll pane za tabelo
        add(scrollPane, BorderLayout.CENTER);  // Dodaj scroll pane v osrednji del okna

        // Panel za vnose
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(7, 2));  // Nastavi razporeditev komponent na panelu

        // Dodaj komponent v panel
        panel.add(new JLabel("Ime:"));
        imeField = new JTextField();
        panel.add(imeField);

        panel.add(new JLabel("Dolžina (km):"));
        dolzinaField = new JTextField();
        panel.add(dolzinaField);

        panel.add(new JLabel("Številka:"));
        stevilkaField = new JTextField();
        panel.add(stevilkaField);

        panel.add(new JLabel("Vrsta:"));
        vrstaComboBox = new JComboBox<>(new String[]{"Avtocesta", "Kmečka cesta"});
        panel.add(vrstaComboBox);

        panel.add(new JLabel("Dodatne Informacije:"));
        dodatneField = new JTextField();
        panel.add(dodatneField);

        maxHitrostField = new JTextField();
        panel.add(new JLabel("Max Hitrost (le za avtoceste):"));
        panel.add(maxHitrostField);
        
        asfaltiranaCheckBox = new JCheckBox("Asfaltirana (le za kmečke ceste)");
        panel.add(asfaltiranaCheckBox);

        JButton dodajButton = new JButton("Dodaj Cesto");
        panel.add(dodajButton);

        JButton posodobiButton = new JButton("Posodobi Cesto");
        panel.add(posodobiButton);

        add(panel, BorderLayout.SOUTH);  // Dodaj panel v spodnji del okna

        // Akcija za gumb dodaj
        dodajButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dodajCesto();  // Kličemo metodo za dodajanje ceste
            }
        });

        // Akcija za gumb posodobi
        posodobiButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                posodobiCesto();  // Kličemo metodo za posodobitev ceste
            }
        });

        // Dogodek klik na tabelo za izbiro ceste
        table.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 1) {
                    int row = table.getSelectedRow();  // Pridobimo izbrano vrstico
                    if (row != -1) {
                        prikaziIzbrano(row);  // Prikazamo podatke izbrane ceste
                    }
                }
            }
        });

        setVisible(true);  // Naredimo okno vidno
    }

    // Metoda za dodajanje nove ceste
    private void dodajCesto() {
        try {
            // Pridobimo podatke iz vnosnih polj
            String ime = imeField.getText();
            double dolzina = Double.parseDouble(dolzinaField.getText());
            int stevilka = Integer.parseInt(stevilkaField.getText());
            String vrsta = (String) vrstaComboBox.getSelectedItem();

            // Preverimo, ali je ime prazno
            if (ime.isEmpty()) {
                JOptionPane.showMessageDialog(this, "Ime ceste ne sme biti prazno!", "Napaka", JOptionPane.ERROR_MESSAGE);
                return;
            }

            // Ustvarimo objekt ceste na podlagi vrste
            Cesta cesta = null;
            if (vrsta.equals("Avtocesta")) {
                int maxHitrost = Integer.parseInt(maxHitrostField.getText());
                cesta = new Avtocesta(ime, dolzina, stevilka, maxHitrost);
            } else if (vrsta.equals("Kmečka cesta")) {
                boolean asfaltirana = asfaltiranaCheckBox.isSelected();
                cesta = new KmeckaCesta(ime, dolzina, stevilka, asfaltirana);
            }

            // Dodamo cesto v tabelo in očistimo vnosna polja
            if (cesta != null) {
                tableModel.addCesta(cesta);
                imeField.setText("");
                dolzinaField.setText("");
                stevilkaField.setText("");
                dodatneField.setText("");
                maxHitrostField.setText("");
                asfaltiranaCheckBox.setSelected(false);
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "Prosim, vnesite veljavne številke!", "Napaka", JOptionPane.ERROR_MESSAGE);
        }
    }

    // Metoda za posodobitev izbrane ceste
    private void posodobiCesto() {
        int rowIndex = table.getSelectedRow();  // Pridobimo indeks izbrane vrstice
        if (rowIndex >= 0) {
            try {
                // Pridobimo podatke iz vnosnih polj
                String ime = imeField.getText();
                double dolzina = Double.parseDouble(dolzinaField.getText());
                int stevilka = Integer.parseInt(stevilkaField.getText());
                String vrsta = (String) vrstaComboBox.getSelectedItem();

                // Preverimo, ali je ime prazno
                if (ime.isEmpty()) {
                    JOptionPane.showMessageDialog(this, "Ime ceste ne sme biti prazno!", "Napaka", JOptionPane.ERROR_MESSAGE);
                    return;
                }

                // Ustvarimo objekt ceste na podlagi vrste
                Cesta cesta = null;
                if (vrsta.equals("Avtocesta")) {
                    int maxHitrost = Integer.parseInt(maxHitrostField.getText());
                    cesta = new Avtocesta(ime, dolzina, stevilka, maxHitrost);
                } else if (vrsta.equals("Kmečka cesta")) {
                    boolean asfaltirana = asfaltiranaCheckBox.isSelected();
                    cesta = new KmeckaCesta(ime, dolzina, stevilka, asfaltirana);
                }

                // Posodobimo cesto v tabeli
                if (cesta != null) {
                    tableModel.updateCesta(rowIndex, cesta);
                }
            } catch (NumberFormatException e) {
                JOptionPane.showMessageDialog(this, "Prosim, vnesite veljavne številke!", "Napaka", JOptionPane.ERROR_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(this, "Prosim, izberite cesto iz tabele!", "Napaka", JOptionPane.ERROR_MESSAGE);
        }
    }

    // Metoda za prikaz podatkov izbrane ceste v vnosnih poljih
    private void prikaziIzbrano(int rowIndex) {
        imeField.setText((String) tableModel.getValueAt(rowIndex, 0));
        dolzinaField.setText(tableModel.getValueAt(rowIndex, 1).toString());
        stevilkaField.setText(tableModel.getValueAt(rowIndex, 2).toString());
        vrstaComboBox.setSelectedItem(tableModel.getValueAt(rowIndex, 3).toString());

        // Prikaz dodatnih informacij
        String dodatneInfo = (String) tableModel.getValueAt(rowIndex, 4);
        if (dodatneInfo.startsWith("Max Hitrost:")) {
            maxHitrostField.setText(dodatneInfo.replace("Max Hitrost: ", ""));
            asfaltiranaCheckBox.setSelected(false);
        } else if (dodatneInfo.startsWith("Asfaltirana:")) {
            asfaltiranaCheckBox.setSelected(dodatneInfo.contains("true"));
            maxHitrostField.setText("");
        }
    }

    // Glavna metoda za zagon GUI aplikacije
    public static void main(String[] args) {
        SwingUtilities.invokeLater(CestaGUI::new);
    }
}
