import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

public class Main {
	
	public static JPanel panelResim;  // ekrandaki ön izleme için
	public static JPanel orijinalPanelResim;  // 1080x1080 orijinal instagram post ölçüsü için
	
	public static JLabel labelOrijinal;
	
	public static JTextPane textPane;
	public static JTextPane textPaneOrijinal;
	
	public static JTextArea textA;
	
	public static StyledDocument doc;
	public static StyledDocument docOrijinal;
	public static SimpleAttributeSet attrs;
	
	public static Color yaziRengi;
	public static Color yaziBgRengi;
	
	public Main() throws IOException {
		
		JFrame frame = new JFrame("1080x1080 Instagram Post Hazırlama | Java Blackboard [124]");
		
		frame.add(resimPaneli());
		frame.add(infoPaneli());
	//	frame.add(orijinalPanelResim);
		
		frame.setSize(1100, 680);  // 2200,1150
		frame.setLayout(null);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setResizable(false);
		frame.setVisible(true);
		
	}
	
	public static JPanel infoPaneli() {
		
		JPanel panel = new JPanel();
		panel.setLayout(null);
		panel.setBackground(new Color(223, 242, 237));
		panel.setBounds(20, 20, 400, 600);
		
		int x = 25;
		int y = 25;
		int w = 350;
		int h = 30;
		int f = 50;
		
		JLabel labelBaslik = new JLabel("1080x1080 px Instagram Post");
		labelBaslik.setFont(new Font("Ubuntu", Font.BOLD, 24));
		labelBaslik.setBounds(x, y, w, h); y = y + f;
		
		JButton resmiGuncelle = new JButton("Resmi Güncelle");
		resmiGuncelle.setBounds(x, y, w, h); y = y + f;
		
		JLabel label = new JLabel("Resme Eklenecek Yazı:");
		label.setBounds(x, y, w, h); y = y + h;
		
		String eklenecekYazi = "Mevlana'nın 7 Öğüdü\n"
				+ "1) Cömertlik ve yardım etmede akarsu gibi ol.\n"
				+ "2) Ṣevkat ve merhamette güneṣ gibi ol.\n"
				+ "3) Başkalarının kusurunu örtmede gece gibi ol.\n"
				+ "4) Hiddet ve asabiyette ölü gibi ol.\n"
				+ "5) Tevazu ve alçakgönüllülükte toprak gibi ol.\n"
				+ "6) Hoṣgörülülükte deniz gibi ol.\n"
				+ "7) Ya olduğun gibi görün ya da göründüğün gibi ol.\n";
		
		textA = new JTextArea(eklenecekYazi);
		textA.setLineWrap(true);
		textA.setWrapStyleWord(true); // JTextArea'da kelimeyi bölmeden bir alt satıra geçer
		textA.setBounds(x, y, 350, 290); y = y + 340;
		
		JButton kaydet = new JButton("Save as JPEG");
		kaydet.setBounds(x, y, w, h); y = y + f;
		
		textA.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            // kullanıcı metin alanına yeni karakterler veya metin eklediğinde 
            // bu metot otomatik olarak tetiklenir.
            public void insertUpdate(DocumentEvent e) {
                updateTextPane();
            }

            @Override
            // Kullanıcı metin alanındaki metni sildiğinde bu metot otomatik olarak tetiklenir. 
            public void removeUpdate(DocumentEvent e) {
                updateTextPane();
            }

            @Override
            // Kullanıcı metin alanındaki metin alanındaki metinin biçimini değiştirdiğinizde 
            // (örneğin, yazı tipi veya renk) bu metot tetiklenebilir.
            public void changedUpdate(DocumentEvent e) {
            	
            }

            private void updateTextPane() {
                
            	/**
            	 * 	Bu metod insertUpdate ve removeUpdate metotları tarafından çağrılır ve 
            	 *  metin alanındaki değişikliklere yanıt olarak gerçekleştirilmesi gereken 
            	 *  özel işlemleri içerir.
            	 */
            	
            	// JTextArea'daki metni JTextPane'e kopyala
                SwingUtilities.invokeLater(() -> {
                    try {
                    	
                        String text = textA.getText();
                        doc = textPane.getStyledDocument();
                        docOrijinal = textPaneOrijinal.getStyledDocument();
                        
                        doc.remove(0, doc.getLength());
                        doc.insertString(0, text, null);
                        
                        docOrijinal.remove(0, docOrijinal.getLength());
                        docOrijinal.insertString(0, text, null);  // null biçimlendirme için.
                        
                        attrs = new SimpleAttributeSet();
        			    StyleConstants.setBackground(attrs, yaziBgRengi);
        			    doc.setCharacterAttributes(0, doc.getLength(), attrs, false);
        			    docOrijinal.setCharacterAttributes(0, docOrijinal.getLength(), attrs, false);

                    } catch (BadLocationException ex) {
                        ex.printStackTrace();
                    }
                });
            }
        });

		
		resmiGuncelle.addActionListener(new ActionListener() {
		    public void actionPerformed(ActionEvent event) {
		    	
		        panelResim.removeAll();
		        
		        try {
		            panelResim.add(textPane);
		            panelResim.add(resimYenile(1080, 1080));
		        } catch (IOException e) {
		            e.printStackTrace();
		        }
		        
		        panelResim.repaint();

		        // orijinalPanelResim'i güncelle
		        orijinalPanelResim.removeAll();
		        
		        try {
		            orijinalPanelResim.add(textPaneOrijinal);
		            orijinalPanelResim.add(labelOrijinal);
		        } catch (Exception e) {
		            e.printStackTrace();
		        }
		        
		        orijinalPanelResim.repaint();
		    }
		});

		
		 kaydet.addActionListener(new ActionListener() {
	    	  public void actionPerformed(ActionEvent e) {
	    		  
	    		  try {
	    			
	    			  BufferedImage bufferedImage = new BufferedImage(panelResim.getWidth(), panelResim.getHeight(), BufferedImage.TYPE_INT_RGB);
	    			  BufferedImage bufferedOrijinalImage = new BufferedImage(orijinalPanelResim.getWidth(), orijinalPanelResim.getHeight(), BufferedImage.TYPE_INT_RGB);
	    			  
	    			  Graphics g = bufferedImage.getGraphics();
	                  Graphics gOrj = bufferedOrijinalImage.getGraphics();
	    			  
	    			  panelResim.paint(g);
	    			  orijinalPanelResim.paint(gOrj);
	    			  
	    			  SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-d HH-mm-ss");
	    			  
	    			  Date date = new Date();
	                  
	    			  ImageIO.write(bufferedImage, "jpeg", new File(getDesktopPath()+"/resim-"+dateFormat.format(date)+".jpg"));
	    			  ImageIO.write(bufferedOrijinalImage, "jpeg", new File(getDesktopPath()+"/orjinalResim-"+dateFormat.format(date)+".jpg"));
	    			  
	    		  } catch (Exception ex) {
	          
	    			  ex.printStackTrace();
	       
	    		  }
	    		  
	    	  }
	    	  
	      });
		
		panel.add(labelBaslik);
		panel.add(resmiGuncelle);
		panel.add(label);
		panel.add(textA);
		panel.add(kaydet);
		
		return panel;
	}
	
	public static JPanel resimPaneli() throws IOException {
		
		Font fontOrijinal = new Font("Ubuntu", Font.BOLD, 35);  // 1080 lik resim için
		Font font = new Font("Ubuntu", Font.BOLD, 18);  // 500'lük resim için
		
		yaziRengi = new Color(197, 200, 217);
		yaziBgRengi = new Color(57, 72, 115);
	    
		//Yazıyı ekliyoruz
	    textPane = new JTextPane();
	    textPane.setForeground(yaziRengi);
	    textPane.setFont(font);
	  	textPane.setOpaque(false);
	    textPane.setEditable(false);
	    textPane.setBounds(50,50,500,500);
	   
	    doc = textPane.getStyledDocument();
	    
	    textPaneOrijinal = new JTextPane();
	    textPaneOrijinal.setForeground(yaziRengi);
	    textPaneOrijinal.setFont(fontOrijinal);
	    textPaneOrijinal.setOpaque(false);
	    textPaneOrijinal.setEditable(false);
	    textPaneOrijinal.setBounds(50,50,980,980);
	   
	    docOrijinal = textPaneOrijinal.getStyledDocument();
	    
	    panelResim = new JPanel();
		panelResim.setLayout(null);
		panelResim.setBackground(new Color(242, 224, 213));
		panelResim.setBounds(480,20,600,600);
		
	    panelResim.add(textPane);
		panelResim.add(resimYenile(1080,1080));
		
		orijinalPanelResim = new JPanel();
		orijinalPanelResim.setLayout(null);
		orijinalPanelResim.setBackground(new Color(242, 224, 213));
		orijinalPanelResim.setBounds(0,0,1080,1080);  // 0,0,  w, h,
		
		orijinalPanelResim.add(textPaneOrijinal);
		orijinalPanelResim.add(labelOrijinal);
		
		return panelResim;
	}
	
	public static JLabel resimYenile(int w, int h) throws IOException {
		
		URL imageUrl = new URL("https://picsum.photos/"+w+"/"+h);
		Image imageOrijinal = ImageIO.read(imageUrl);
		
		labelOrijinal = new JLabel(new ImageIcon(imageOrijinal));
		labelOrijinal.setBounds(0, 0, 1080, 1080);
		
		Image image = imageOrijinal.getScaledInstance(600, 600, Image.SCALE_DEFAULT);
		
		JLabel label = new JLabel(new ImageIcon(image));
		label.setBounds(0, 0, 600, 600);
		
		return label;
	}
	
	public static String getDesktopPath() {
	    // Bu method, sistemde bulunan kullanıcının masaüstü klasörünün yolunu döndürür.
	    // Öncelikle, java.nio.file.Paths sınıfının get() yöntemini kullanır.
	    // Bu yöntem, sistemde bulunan kullanıcının masaüstü klasörünün yolunu döndürür.
	    Path desktopPath = Paths.get(System.getProperty("user.home"), "Desktop");
	    
	    // Daha sonra, bulunan yolu String olarak dönüştürmek için toString() yöntemini kullanırız.
	    String desktopPathString = desktopPath.toString();
	    
	    // Son olarak, bulunan masaüstü yolunu döndürürüz.

	    return desktopPathString;
	  }
}
