import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.event.MouseInputAdapter;

public class OranliSeciliAlanKeydet {

    private BufferedImage resim;
    private Rectangle seciliAlan;
    private Point seciliAlanBaslangic;

    public OranliSeciliAlanKeydet() throws IOException {
    	
    	// https://littlevisuals.co/  Bu site Nic Jackson anisina ücretsiz fotograf sunmaktadir.
    	
        resim = ImageIO.read(new File("src/images/vana.jpeg"));
        
        seciliAlan = new Rectangle(0, 0, 160, 90);  // 16:9 oranli ilk alan
        seciliAlanBaslangic = new Point(0, 0);
        
        JPanel panel = new JPanel() {
            
            public void paintComponent(Graphics grafik) {
            	grafik.drawImage(resim, 0, 0, null);
            	grafik.drawRect(seciliAlan.x, seciliAlan.y, seciliAlan.width, seciliAlan.height);
            }

            public Dimension getPreferredSize() {  // Panelin ölçüsü resim ölçüsüne ayarlanir...
                return new Dimension(resim.getWidth(), resim.getHeight());
            }
        };

        
        panel.addMouseListener(new MouseInputAdapter() {
            
            public void mousePressed(MouseEvent event) {
                
            	seciliAlanBaslangic = event.getPoint();
                seciliAlan.setLocation(seciliAlanBaslangic);
                
            }

            
            public void mouseReleased(MouseEvent event) {
            	
                kaydet();
                kaydetOran();
            
            }
        });

        panel.addMouseMotionListener(new MouseInputAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {

                // Oran 1024×576
                double oran = 1024.0 / 576.0;

                int x = seciliAlanBaslangic.x;
                int y = seciliAlanBaslangic.y;
                int width = e.getX() - seciliAlanBaslangic.x;
                int height = e.getY() - seciliAlanBaslangic.y;

                // Yüksekliğe göre genişliği ayarla
                if (Math.abs(height) * oran <= Math.abs(width)) {
                    width = (int) (Math.signum(width) * Math.abs(height) * oran);
                } 
                // Genişliğe göre yüksekliği ayarla
                else {
                    height = (int) (Math.signum(height) * Math.abs(width) / oran);
                }

                seciliAlan.setBounds(x, y, width, height);

                panel.repaint();
            }
        });
        
        JFrame frame = new JFrame("Oranli Seçili Resim Alanini Kaydet | Java Blackboard [110]");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    // Orana gore seçilen alani ölçüye göre kaydeder --->  ORAN 16:9   ---->  ÖLÇÜ 1024×576
    private void kaydetOran() {  
    	
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-d HH-mm-ss");
		Date date = new Date();
		
		int genislik = 1024;
		int yukseklik = 576;
    	
    	BufferedImage secilenAlan = resim.getSubimage(seciliAlan.x, seciliAlan.y, seciliAlan.width, seciliAlan.height);
   		
    	BufferedImage scaledImage = new BufferedImage(genislik, yukseklik, secilenAlan.getType());
    	
    	Graphics2D graphics = scaledImage.createGraphics();
    	graphics.drawImage(secilenAlan, 0, 0, genislik, yukseklik, null);
    	graphics.dispose();

    	File kaydedilecekDosya = new File("src/images/secilenAlan-"+dateFormat.format(date)+".jpg");
            	
    	try {
    	    ImageIO.write(scaledImage, "jpg", kaydedilecekDosya);
    //	    System.out.println("Dosya kaydedildi: " + kaydedilecekDosya.getAbsolutePath());
    	} catch (IOException e) {
    	    e.printStackTrace();
    	}
    }
    
    // Mouse ile seçilen alani kaydeder... 
    // Mouse ile belirlenen Orijinal olçüde....
    private void kaydet() { 
    	
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-d HH-mm-ss");
		Date date = new Date();

    	
    	BufferedImage secilenAlan = resim.getSubimage(seciliAlan.x, seciliAlan.y, seciliAlan.width, seciliAlan.height);

    	Graphics2D graphics = secilenAlan.createGraphics();
    	graphics.drawImage(secilenAlan, 0, 0, seciliAlan.width, seciliAlan.height, null);
    	graphics.dispose();
    	
    	File kaydedilecekDosya = new File("src/images/secilenAlan_"+dateFormat.format(date)+".jpg");
            	
        try {
        
        	ImageIO.write(secilenAlan, "jpg", kaydedilecekDosya);
       //     System.out.println("Dosya kaydedildi: " + kaydedilecekDosya.getAbsolutePath());
        
        } catch (IOException e) {
        
        	e.printStackTrace();
        
        }
    }

    public static void main(String[] args) {
       
    	SwingUtilities.invokeLater(() -> {
    	    
    		try {
				
    			new OranliSeciliAlanKeydet();
			
    		} catch (IOException e) {

				e.printStackTrace();
			}
    		
        });

    }
}

