import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.ButtonGroup;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.event.MouseInputAdapter;
import javax.swing.filechooser.FileNameExtensionFilter;

public class OpenSaveExit {
	
	public static JFrame frame;
	
	public static JPanel anaPanel = new JPanel();
	public static JPanel merkezPanel = new JPanel();
	
	public static int anaPanelGenislik; 
    public static int anaPanelYukseklik;
    
    public static int resimGenislik; 
    public static int resimYukseklik;
    
    public static int x; // merkezPanel'in koordinatları
    public static int y;
    
    public static BufferedImage resim;
	
	public OpenSaveExit() throws IOException {
		
		resim = ImageIO.read(new File("src/images/nehir.png"));  // açılış resmi.
		
		frame = new JFrame("Frame Merkezinde Resim Göster | Java Blackboard [150]");
		frame.setLayout(null);
		
		JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("File");

        JMenuItem openItem = new JMenuItem("Open...");
        JMenu openSrcImages = new JMenu("Open Images");  // File altında sağa açılır menü oluşturacak.
        JMenuItem saveItem = new JMenuItem("Save");
        JMenuItem exitItem = new JMenuItem("Exit");
        
        String[] imagesDosyalari = resimDosyaListesi();
        JMenuItem[] itemDosyaListesi = new JMenuItem[imagesDosyalari.length];
        
        for (int i = 0; i < imagesDosyalari.length; i++) {
            System.out.println(i + ". " + imagesDosyalari[i]);
            itemDosyaListesi[i] = new JMenuItem(imagesDosyalari[i]);
            openSrcImages.add(itemDosyaListesi[i]);

            // Her bir menü öğesine ActionListener ekleyin
            itemDosyaListesi[i].addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        // Seçilen resmi yükle
                        resim = ImageIO.read(new File("src/images/" + e.getActionCommand()));
                        anaPaneliGuncelle(resim);
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            });
        }
        
        fileMenu.add(openItem);
        fileMenu.add(openSrcImages);
        fileMenu.addSeparator(); // Ayırıcı ekleyelim bi tane
        fileMenu.add(saveItem);
        fileMenu.addSeparator(); // Ayırıcı ekleyelim bi tane
        fileMenu.add(exitItem);

        menuBar.add(fileMenu);
		
		// ComponentAdapter ile frame boyutu değiştiğinde tetiklenecek olayları dinliyoruz
        frame.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                // Frame boyutu değiştikçe anaPanel'in boyutunu güncelleyelim
                anaPanel.setSize(frame.getSize());
                
                // Boyut değiştikten sonra değerleri alalim
                anaPanelGenislik = anaPanel.getWidth();
                anaPanelYukseklik = anaPanel.getHeight();
 
                x = anaPanelGenislik/2-(resimGenislik/2);
        		y = anaPanelYukseklik/2-((resimYukseklik/2)+22);  // +22 frame baslik + menuBar yükseklik
        		
        		merkezPanel.setBackground(new Color(232, 74, 74));
        		merkezPanel.setLayout(null);
        		merkezPanel.setBounds(x, y, resimGenislik, resimYukseklik);
        		
        		try {
					merkezPanel.add(resimPaneli());
				} catch (IOException e1) {
					e1.printStackTrace();
				}
        		
        		anaPanel.add(merkezPanel);
            }
        });
        
        // ActionListener ekleyerek "Open..." menü öğesine tıklanınca çağrılacak metod
        openItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                
            	resim = resimSec();
            	
            	anaPaneliGuncelle(resim);
            	
            }
        });
     

        exitItem.addActionListener(new ActionListener() {
        	public void actionPerformed(ActionEvent e) {
        		
        		// Yöntem 1 -> Uygulamayi kapatir.
        		System.exit(0);
        		
        		// Yöntem 2 -> belirli bir JFrame'in kapatılmasını sağlar.
        	//	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            //  frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));

        	}
        });

		anaPanel.setLayout(null);
		anaPanel.setBackground(new Color(233, 245, 219));
		
		frame.setJMenuBar(menuBar);
		
		frame.getContentPane().add(anaPanel);
		
		frame.setSize(960, 540); // 16:9
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setResizable(true);
		frame.setVisible(true);
	    
	}
	
	public static JPanel resimPaneli() throws IOException {
		
		resimGenislik = resim.getWidth();
	    resimYukseklik = resim.getHeight();
		
		JPanel resimPanel = new JPanel() {
            
			public void paintComponent(Graphics grafik) {
                
				grafik.drawImage(resim, 0, 0, null);  // resmi orijinal haliyle gostermek için.
			 
			}
			
        };
   
        resimPanel.setBounds(0, 0, resimGenislik, resimYukseklik);

        return resimPanel;
        
	}
	
	 
    public static BufferedImage resimSec() {
    	
        JFileChooser fileChooser = new JFileChooser();
        
        // ilk parametresi, dosya filtresinin açıklamasını temsil eder.
        // "Yalnız: JPG JPEG PNG", Kullaniciya yönlendirme mesajı.
        FileNameExtensionFilter dosyaTuru = new FileNameExtensionFilter("Yalnız: JPG JPEG PNG", "jpg", "jpeg", "png");
        
        // kullanıcının sadece belirli türde dosyaları seçebilmesini sağlar. 
        fileChooser.setFileFilter(dosyaTuru);

        // null parametresi, pencerenin merkezi konumda açılmasını sağlar.
        int result = fileChooser.showOpenDialog(null);
        
        // bir dosya seçeilirse, bu metodun dönüş değeri APPROVE_OPTION olur
        if (result == JFileChooser.APPROVE_OPTION) {
            
        	File selectedFile = fileChooser.getSelectedFile();
            
        	try {
        		
                return ImageIO.read(selectedFile);
            
        	} catch (IOException e) {
                
        		e.printStackTrace();
                // Hata durumunda null dönebiliriz veya isteğe bağlı olarak hata mesajı gösterebiliriz.
        		System.out.print("Bir hata oldu.");
            }

        // bir dosya seçmez veya pencere kapanırsa, dönüş değeri CANCEL_OPTION olur.
        } else if(result == JFileChooser.CANCEL_OPTION) {
        	
        	try {
    			resim = ImageIO.read(new File("src/images/secimYok.jpg"));
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
            
            return resim;
            
        }
        
        // Kullanıcı dosya seçmezse veya bir hata oluşursa:
        return null;
        
    }

    public static String[] resimDosyaListesi() {
        
    	String dizinYolu = "src/images/";
        File dizin = new File(dizinYolu);

        // Dosya listesini tutmak için bir liste oluşturuyoruz
        List<String> dosyaListesi = new ArrayList<>();

        // önce dizin var mı yok mu kontrol edelim
        if (dizin.exists() && dizin.isDirectory()) {
            
        	// Dizin içindeki dosyaları listeleyelim
            File[] dosyalar = dizin.listFiles();
            
            if (dosyalar != null) {
                
            	for (File dosya : dosyalar) {
                    
            		// Dosyanın uzantısını alalım
                    String dosyaUzantisi = dosya.getName().toLowerCase();
                    
                    if (dosya.isFile() && (dosyaUzantisi.endsWith(".jpg") || dosyaUzantisi.endsWith(".jpeg") || dosyaUzantisi.endsWith(".png"))) {
                        // Dosyanın uzantısı jpg, jpeg veya png ise listeye ekleyelim
                        dosyaListesi.add(dosya.getName());
                    }
                }
            }
        }

        // Listeyi diziye çeviriyoruz.
        String[] dosyaDizisi = new String[dosyaListesi.size()];
        dosyaDizisi = dosyaListesi.toArray(dosyaDizisi);
        
        return dosyaDizisi;
    }
    
	public static void anaPaneliGuncelle(BufferedImage secilenResim) {
		
		// "Open..." seçildiğinde yapılacak işlemler
        anaPanel.removeAll(); // Eski resimPanel'i temizle
        merkezPanel.removeAll();

        resim = secilenResim;

        // Yeni resim boyutları
        resimGenislik = resim.getWidth();
        resimYukseklik = resim.getHeight();

        merkezPanel.setBackground(new Color(232, 74, 74));
        merkezPanel.setLayout(null);
        merkezPanel.setBounds(x, y, resimGenislik, resimYukseklik);

        try {
            merkezPanel.add(resimPaneli());
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        anaPanel.add(merkezPanel);
        
        anaPanel.setBackground(new Color(77, 77, 77));

        // Yeni resim boyutlarına göre anaPanel ve merkezPanel boyutlarını ayarlayalim
        anaPanel.setSize(resimGenislik, resimYukseklik);
        // Pencere kenarlık ve başlık çubuğu için +39
        frame.setSize(resimGenislik + 200, resimYukseklik + 239); 
        
        anaPanel.repaint();
        
        frame.setLocationRelativeTo(null);
		
	}
    public static void main(String[] args) throws IOException {
		
		new OpenSaveExit();

	}

}
