import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import java.nio.file.Path;
import java.nio.file.Paths;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class PlakaOlustur {
	
	public static String fontYolu = "font/Oswald-Bold.ttf";
	public static Font font = fontYukle(fontYolu);
	
	public static String plakaSehirKodu;
	public static String plakaHarfKodu;
	public static String plakaSayiKodu;
	
	public static int harfUzunlugu;
	public static int plakaSayi;
	public static int plakaSehir;
	
	public PlakaOlustur() {
		
		JFrame frame = new JFrame("Plaka Resmi JPG | Java Blackboard [117]");
				
		JPanel anapanel = new JPanel();
		anapanel.setLayout(null);
		anapanel.setBounds(0,0,1055,550);
		
		JPanel plakaInfoPaneli = new JPanel();
		plakaInfoPaneli.setLayout(null);
		plakaInfoPaneli.setBackground(new Color(195, 226, 244)); // Mavi background rengi
		plakaInfoPaneli.setBounds(75,25,900,80);
		
		String[] sehirler = new String[81];
		sehirler[0] = "Adana";
		sehirler[1] = "Adıyaman";
		sehirler[2] = "Afyon";
		sehirler[3] = "Ağrı";
		sehirler[4] = "Amasya";
		sehirler[5] = "Ankara";
		sehirler[6] = "Antalya";
		sehirler[7] = "Artvin";
		sehirler[8] = "Aydın";
		sehirler[9] = "Balıkesir";
		sehirler[10] = "Bilecik";
		sehirler[11] = "Bingöl";
		sehirler[12] = "Bitlis";
		sehirler[13] = "Bolu";
		sehirler[14] = "Burdur";
		sehirler[15] = "Bursa";
		sehirler[16] = "Çanakkale";
		sehirler[17] = "Çankırı";
		sehirler[18] = "Çorum";
		sehirler[19] = "Denizli";
		sehirler[20] = "Diyarbakır";
		sehirler[21] = "Edirne";
		sehirler[22] = "Elazığ";
		sehirler[23] = "Erzincan";
		sehirler[24] = "Erzurum";
		sehirler[25] = "Eskişehir";
		sehirler[26] = "Gaziantep";
		sehirler[27] = "Giresun";
		sehirler[28] = "Gümüşhane";
		sehirler[29] = "Hakkari";
		sehirler[30] = "Hatay";
		sehirler[31] = "Isparta";
		sehirler[32] = "Mersin İçel";
		sehirler[33] = "İstanbul";
		sehirler[34] = "İzmir";
		sehirler[35] = "Kars";
		sehirler[36] = "Kastamonu";
		sehirler[37] = "Kayseri";
		sehirler[38] = "Kırklareli";
		sehirler[39] = "Kırşehir";
		sehirler[40] = "Kocaeli";
		sehirler[41] = "Konya";
		sehirler[42] = "Kütahya";
		sehirler[43] = "Malatya";
		sehirler[44] = "Manisa";
		sehirler[45] = "Kahramanmaraş";
		sehirler[46] = "Mardin";
		sehirler[47] = "Muğla";
		sehirler[48] = "Muş";
		sehirler[49] = "Nevşehir";
		sehirler[50] = "Niğde";
		sehirler[51] = "Ordu";
		sehirler[52] = "Rize";
		sehirler[53] = "Sakarya";
		sehirler[54] = "Samsun";
		sehirler[55] = "Siirt";
		sehirler[56] = "Sinop";
		sehirler[57] = "Sivas";
		sehirler[58] = "Tekirdağ";
		sehirler[59] = "Tokat";
		sehirler[60] = "Trabzon";
		sehirler[61] = "Tunceli";
		sehirler[62] = "Şanlıurfa";
		sehirler[63] = "Uşak";
		sehirler[64] = "Van";
		sehirler[65] = "Yozgat";
		sehirler[66] = "Zonguldak";
		sehirler[67] = "Aksaray";
		sehirler[68] = "Bayburt";
		sehirler[69] = "Karaman";
		sehirler[70] = "Kırıkkale";
		sehirler[71] = "Batman";
		sehirler[72] = "Şırnak";
		sehirler[73] = "Bartın";
		sehirler[74] = "Ardahan";
		sehirler[75] = "Iğdır";
		sehirler[76] = "Yalova";
		sehirler[77] = "Karabük";
		sehirler[78] = "Kilis";
		sehirler[79] = "Osmaniye";
		sehirler[80] = "Düzce";
		
		int x = 50;
		int y = 25;
		int w = 50;
		int h = 30;
		int f = x + w;
		
		JComboBox sehirlerCombo = new JComboBox(sehirler);
		sehirlerCombo.setSelectedIndex(33);
		sehirlerCombo.setBounds(x, y, w+100, h); x = x + f + 100;
		
		JLabel kodLabel = new JLabel("Orta Harfler");
		kodLabel.setBounds(x, y, w+100, h); x = x + w + 50;
		
		JTextField kodTextF = new JTextField("---",3);
		kodTextF.setBounds(x, y, w, h); x = x + f;
				
		JLabel sayiLabel = new JLabel("Sayı");
		sayiLabel.setBounds(x, y, w, h); x = x + w;
		
		JTextField sayiTextF = new JTextField("----",4);  // En fazla 4 karakter olabilir.
		
		// AbstractDocument sınıfı, doküman tabanlı metin bileşenlerinin temel sınıfıdır 
		// ve bu tür bileşenlerin metin düzenleme özelliklerini yönetir.
		((AbstractDocument) sayiTextF.getDocument()).setDocumentFilter(new DocumentFilter() {
            @Override
            public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
               
            	/*
            	Parametrelerin açıklamaları:

            		FilterBypass fb: 	Bu nesne, filtreleme işleminde orijinal metni değiştirme yeteneği sağlar. 
            							Filtreleme işlevi, FilterBypass üzerinden gerçekleştirilen bu değişikliklerle yönlendirilir.
            		
            		int offset: Bu, değiştirme işleminin metinde başlayacağı konumu belirtir.
            		
            		int length: Bu, değiştirme işleminin başlayacağı konumdan itibaren 
            					kaç karakteri değiştireceğini belirtir.
            		
            		String text: Bu, kullanıcının eklemeye çalıştığı yeni metin parçasını içerir.
            		
            		AttributeSet attrs: Bu, metin özelliklerini içerebilecek bir özellik kümesidir. 
            							Genellikle bu parametre doküman özelliklerini temsil eder.
            	*/
            	
            	String newText = fb.getDocument().getText(0, fb.getDocument().getLength()) + text;
            	String uzunluk = "\\d{0,4}"; 	// \d ifadesi rakamlar için kullanilir. 
            									//{0,4} ifadesi en fazla 4 haneli bir sayi olacagini belirtir.
            	
                if (newText.matches(uzunluk)) { // Sadece 4 karakter girilmesii için
                    super.replace(fb, offset, length, text, attrs);
                }
            }
        });
		
		sayiTextF.setBounds(x, y, w+20, h); x = x + w + 80;
		
		JButton kaydet = new JButton("Save as JPEG");
	    kaydet.setBounds(x, y, w+100, h);
		
	    // Plakanin grafik paneline eklenmesi.
		JPanel plakaPanel = new JPanel() {
		    @Override
		    protected void paintComponent(Graphics g) {
		        super.paintComponent(g);
		        Graphics2D g2d = (Graphics2D) g;

		        int width = getWidth()-20; 
		        int height = getHeight()-20;
		        int arcRadius = 21; // Köşe yarıçapı
		        int borderWidth = 5; // SIYAH Kenarlık kalınlığı

		        g2d.setColor(Color.WHITE);  
		        g2d.fillRoundRect(3, 3, width - 7, height - 7, arcRadius, arcRadius);
		        
		        g2d.setColor(new Color(0,50,255));  // Mavi TR yazan kisim.
		        g2d.fillRect(12, 12, 80, height - 7);

		        // Siyah iç çizgi çizimi
		        g2d.setColor(Color.BLACK);
		        g2d.setStroke(new BasicStroke(borderWidth));
		        g2d.drawRoundRect(12, 12, width - borderWidth, height - borderWidth, arcRadius, arcRadius);
		    }
		};

		
	    plakaPanel.setBounds(55,125,965,220);
	    plakaPanel.setLayout(null);
	    plakaPanel.setPreferredSize(new Dimension(945, 200));
	    
	    JLabel trLabel = new JLabel("TR");
	    trLabel.setFont(new Font("Verdana", Font.PLAIN, 50));
	    trLabel.setForeground(Color.WHITE);
	    trLabel.setBounds(22,120,200,55);
	    
	    plakaSehir = sehirlerCombo.getSelectedIndex() + 1;
    	plakaSehirKodu = String.valueOf(plakaSehir);
    	
 	    plakaHarfKodu = kodTextF.getText();
	    plakaSayiKodu = sayiTextF.getText();
	    
	    sehirlerCombo.addActionListener(new ActionListener() {
	        @Override
	        public void actionPerformed(ActionEvent e) {
	        	
	        	plakaSehir = sehirlerCombo.getSelectedIndex() + 1;
	        	plakaSehirKodu = String.valueOf(plakaSehir);
	        	
	        	if(plakaSehir<10) plakaSehirKodu = "0" + plakaSehirKodu;
	        	
	    	    plakaPanel.removeAll(); // Plakadaki her seyi siliyoruz önce.
	    	    
	            plakaPanel.add(ilKodu(plakaSehirKodu));
	            plakaPanel.add(harfKodu(plakaHarfKodu));
	            plakaPanel.add(sayiKodu(plakaSayiKodu));
	            plakaPanel.add(trLabel);
	            plakaPanel.revalidate(); // Yeniden çizimi güncellemek için revalidate() çağrısı
	            plakaPanel.repaint();

	        }
	    });
	    
	    
	   
	    kodTextF.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                char karakter = e.getKeyChar();
                
                // Eğer harf değilse veya 3 karakteri geçtiyse tuş girişi engelleniyor
                if (!Character.isLetter(karakter) || kodTextF.getText().length() >= 3) {
                    e.consume(); 
                } else {
                	// Harf ise büyük harf olarak görüntülenmesi sağlanıyor
                    e.setKeyChar(Character.toUpperCase(karakter));
                }
                
            }
            
            public void keyPressed(KeyEvent e) {
		        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
		     
		        	plakaHarfKodu = kodTextF.getText();
		    		harfUzunlugu = kodTextF.getText().length();
		    		
		        	plakaPanel.removeAll();
		            plakaPanel.add(ilKodu(plakaSehirKodu));
		            plakaPanel.add(harfKodu(plakaHarfKodu));
		            plakaPanel.add(sayiKodu(plakaSayiKodu));
		            plakaPanel.add(trLabel);
		            plakaPanel.revalidate();
		            plakaPanel.repaint();
		            
		        }
		        
            }
        });
	    
	    sayiTextF.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
		        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
		        	
		        	plakaSayiKodu = sayiTextF.getText();
		        	
		        	plakaPanel.removeAll();
		            plakaPanel.add(ilKodu(plakaSehirKodu));
		            plakaPanel.add(harfKodu(plakaHarfKodu));
		            plakaPanel.add(sayiKodu(plakaSayiKodu));
		            plakaPanel.add(trLabel);
		            plakaPanel.revalidate();
		            plakaPanel.repaint();
		            
		        }
		        
            }
        });
	   
	    kaydet.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    BufferedImage image = new BufferedImage(
                    		plakaPanel.getWidth(), 
                    		plakaPanel.getHeight(),
                            BufferedImage.TYPE_INT_RGB);
                    
                    Graphics2D g2 = image.createGraphics();
                    plakaPanel.paint(g2);
                    g2.dispose();
                    
                    ImageIO.write(image, "jpeg", new File(getDesktopPath()+"/" + plakaSehirKodu + "-" + plakaHarfKodu + "-" + plakaSayiKodu +".jpg"));//34-abc-2020.
      			  	
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });
	    
        plakaPanel.add(ilKodu(plakaSehirKodu));
	    plakaPanel.add(harfKodu(plakaHarfKodu));
	    plakaPanel.add(sayiKodu(plakaSayiKodu));
	    
	    plakaPanel.add(trLabel);
	    
		plakaInfoPaneli.add(sehirlerCombo);
		plakaInfoPaneli.add(kodLabel);
		plakaInfoPaneli.add(kodTextF);
		plakaInfoPaneli.add(sayiLabel);
		plakaInfoPaneli.add(sayiTextF);
		plakaInfoPaneli.add(kaydet);
		
		anapanel.add(plakaInfoPaneli);
		anapanel.add(plakaPanel);
		
		frame.add(anapanel);
		
		frame.setSize(1055,550);
		frame.setLayout(null);
		frame.setResizable(false);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		
	}
	
	public static String getDesktopPath() {
		
		// Masaüstü yolunun alinmasi.	   
		Path desktopYolu = Paths.get(System.getProperty("user.home"), "Desktop");
		String desktopYoluString = desktopYolu.toString();
	    
	    return desktopYoluString;
	    
	}
	
	public static JLabel ilKodu(String plaka) {
		
		JLabel ilKoduLabel = new JLabel(plaka);
		ilKoduLabel.setHorizontalAlignment(JLabel.LEFT);
		ilKoduLabel.setFont(font);
		
		ilKoduLabel.setBounds(102,5,180,180);  
		
		return ilKoduLabel;
		
	}
	
	public static JLabel harfKodu(String harfler) {
		
		JLabel harfKoduLabel = new JLabel(harfler);
		harfKoduLabel.setHorizontalAlignment(JLabel.CENTER);
		harfKoduLabel.setFont(font);
		harfKoduLabel.setBounds(250,5,400,180); 
		
		return harfKoduLabel;
		
	}
	
	public static JLabel sayiKodu(String sayilar) {
		
		JLabel sayiKoduLabel = new JLabel(sayilar);
		sayiKoduLabel.setHorizontalAlignment(JLabel.RIGHT);
		sayiKoduLabel.setFont(font);
		sayiKoduLabel.setBounds(535,5,400,180); 
		
		return sayiKoduLabel;
		
	}
		
	public static Font fontYukle(String fontAdres) {
	    
		try {
	        
	    	InputStream fontStream = ClassLoader.getSystemResourceAsStream(fontAdres);
	        Font font = Font.createFont(Font.TRUETYPE_FONT, fontStream);
	        fontStream.close();
	    
	        return font.deriveFont(Font.PLAIN, 140); // Font boyutunu ayarla
	    
	    } catch (Exception e) {
	    	
	        e.printStackTrace();
	        return new Font("Arial", Font.PLAIN, 150); // Hata durumunda varsayılan font kullan
	    }
	}
	
	public static void main(String[] args) {
		
		new PlakaOlustur();
	}

}