import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DecimalFormat;

public class AnketAnalizPastaGrafik {

    public static String[] soruMetinleri = {
            "Menü seçimi ve yemek çeşitlerinin uygunluğu",
            "Yemeklerin sunuluş biçimi",
            "Yemeklerin lezzeti",
            "Yemeklerin sıcaklığı",
            "Yemeklerin miktarı",
            "Restoran personelinin davranışı",
            "Servisin kalitesi",
            "Temizlik ve hijyen kurallarına uyum",
            "Restoranımızı tavsiye eder misiniz?"
    };
    
    public static JPanel anaPanel = new JPanel();

    private static int[][] cevapSayilari = new int[soruMetinleri.length][3];
    private static int erkekSayisi = 0;
    private static int kadinSayisi = 0;
    
    private static JLabel isimLabel;
	private static JLabel yasLabel;
	private static JLabel cinsiyetLabel;
	
    private static JTextField fieldIsim;
    private static JTextField fieldYas;
    
    private static JRadioButton[] cinsiyetSecenekleri;
    private static JRadioButton[][] soruSecenekleri;
    
    public static String[] sonuclar;

    public AnketAnalizPastaGrafik() {

        JFrame frame = new JFrame();
        frame.setTitle("Restoran Memnuniyet Anketi ve Pasta Grafik Analiz JMenu | Java Blackboard [157]");
        frame.setLayout(null);
        
        JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("File");

        JMenuItem anketItem = new JMenuItem("Anket");
        JMenu bosItem = new JMenu("Boş");  // File altında sağa açılır menü oluşturacak.
        JMenuItem analizItem = new JMenuItem("Analiz");
        JMenuItem exitItem = new JMenuItem("Exit");
        
         
        
        fileMenu.add(anketItem);
        fileMenu.add(bosItem);
        fileMenu.addSeparator(); // Ayırıcı ekleyelim bi tane
        fileMenu.add(analizItem);
        fileMenu.addSeparator(); // Ayırıcı ekleyelim bi tane
        fileMenu.add(exitItem);

        menuBar.add(fileMenu);
        
        int anaPanelYukseklik = 2120;  // Scroll ölçüsü.
        
        anaPanel = new JPanel();
		anaPanel.setLayout(null);
		anaPanel.setBackground(new Color(140, 160, 50));
		anaPanel.setPreferredSize(new Dimension(1040, anaPanelYukseklik));
		
	//	anaPanel.add(anketPaneli());
		
		JScrollPane anaPanelScroll = new JScrollPane(anaPanel);
		anaPanelScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		anaPanelScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		anaPanelScroll.setBounds(50, 50, 900, 580);
		
        // ActionListener ekleyerek "anketItem" menü öğesine tıklanınca çağrılacak metod
        anketItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                
            	anaPanel.removeAll();
            	
            	anaPanel.add(anketPaneli());
            	
            	anaPanel.repaint();
            	
            }
        });
        
        // ActionListener ekleyerek "analizItem" menü öğesine tıklanınca çağrılacak metod
        analizItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                
            	anaPanel.removeAll();
            	
            	anaPanel.add(analizPaneli());
            	
            	anaPanel.repaint();
            	
            }
        });
        
        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));

        	}
        });
        
        frame.add(anaPanelScroll);
        
        frame.setJMenuBar(menuBar);

        frame.setSize(990, 720);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static JPanel anketPaneli() {
    	
    	JPanel anketPaneli = new JPanel();
    	anketPaneli.setLayout(null);
    	anketPaneli.setBackground(new Color(212, 248, 183));
    	anketPaneli.setBounds(20, 20, 830, 540);
    	
        // Giriş formu bileşenleri
    	isimLabel = new JLabel("İsim:");
    	isimLabel.setBounds(20, 20, 100, 30);
    	
        fieldIsim = new JTextField();
        fieldIsim.setBounds(120, 20, 200, 30);
       
        yasLabel = new JLabel("Yaş:");
    	yasLabel.setBounds(20, 50, 100, 30);
    	
        fieldYas = new JTextField();
        fieldYas.setBounds(120, 50, 200, 30);
        
        cinsiyetLabel = new JLabel("Cinsiyet:");
        cinsiyetLabel.setBounds(20, 80, 100, 30);
        
        ButtonGroup cinsiyetGrubu = new ButtonGroup();
        cinsiyetSecenekleri = new JRadioButton[]{
                new JRadioButton("Erkek"),
                new JRadioButton("Kadın")
                
        };
        
        int cinsiyetX = 120;
        int cinsiyetIndex = 0;
        
        for (JRadioButton radio : cinsiyetSecenekleri) {
        	
        	cinsiyetGrubu.add(radio);
            cinsiyetSecenekleri[cinsiyetIndex].setBounds(cinsiyetX, 80, 100, 30);
            
            anketPaneli.add(radio);
            cinsiyetIndex++;
            cinsiyetX+=100;
        }

        // Anket formu bileşenleri
        soruSecenekleri = new JRadioButton[soruMetinleri.length][3];
        JLabel[] soruLabel = new JLabel[soruMetinleri.length];
        
        int soruY = 110;
        int soruFark = 30;
        
        for (int i = 0; i < soruMetinleri.length; i++) {
        	
        	soruLabel[i] = new JLabel((i + 1) + ". " + soruMetinleri[i]);
        	soruLabel[i].setBounds(20, soruY, 400, 30);
        	anketPaneli.add(soruLabel[i]);
        	
            ButtonGroup soruGrubu = new ButtonGroup();
            for (int j = 0; j < 3; j++) {
                soruSecenekleri[i][j] = new JRadioButton(getSecenekMetni(j));
                soruSecenekleri[i][j].setBounds(420+(100*j), soruY, 100, 30);
                
                soruGrubu.add(soruSecenekleri[i][j]);
                anketPaneli.add(soruSecenekleri[i][j]);
            }
            
            soruY+=soruFark;
        }

        // Bitir düğmesi
        JButton butonBitir = new JButton("Bitir");
        butonBitir.setBounds(20, soruY, 100, 30);
        
        butonBitir.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                anketiKaydet();
            }
        });
        
        anketPaneli.add(isimLabel);
        anketPaneli.add(fieldIsim);
        anketPaneli.add(yasLabel);
        anketPaneli.add(fieldYas);
        anketPaneli.add(cinsiyetLabel);
        
        anketPaneli.add(butonBitir);
        
        return anketPaneli;
    }

    private static String getSecenekMetni(int indeks) {
        switch (indeks) {
            case 0:
                return "Çok İyi";
            case 1:
                return "İyi";
            case 2:
                return "Kötü";
            default:
                return "";
        }
    }

    private static void anketiKaydet() {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter("src/Anket.txt", true))) {
            
        	String isimYasCinsiyet = fieldIsim.getText() + "," + fieldYas.getText() + ","+ secilenCinsiyet();
        	String cevap = "";

            for (int i = 0; i < soruMetinleri.length; i++) {
            	 cevap = cevap + "," + secilenSoruCevabi(soruSecenekleri[i]);
            }
            
            writer.write(isimYasCinsiyet + cevap + "\n");
            
            JOptionPane.showMessageDialog(null, "Anket başarıyla kaydedildi!");
        } catch (IOException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, "Anket kaydedilirken bir hata oluştu.");
        }
    }

    private static String secilenCinsiyet() {
        for (JRadioButton radio : cinsiyetSecenekleri) {
            if (radio.isSelected()) {
                return radio.getText();
            }
        }
        return "Cinsiyet seçilmedi";
    }

    private static String secilenSoruCevabi(JRadioButton[] secenekler) {
        for (JRadioButton radio : secenekler) {
            if (radio.isSelected()) {
                return radio.getText();
            }
        }
        return "-1";
    }
    
    public static JPanel analizPaneli() {
    	
    	JPanel analizPaneli = new JPanel();
    	analizPaneli.setLayout(null);
    //	analizPaneli.setPreferredSize(new Dimension(100, 100));	// Göstermelik bi ölçü veriyoruz...
    	analizPaneli.setBackground(new Color(212, 248, 183));
    	analizPaneli.setBounds(20, 20, 830, 2050);
    	 
        Font font = new Font("Ubuntu", Font.PLAIN, 29);
        
        // Anket.txt dosyasi her seferinde bastan okundugu için
        // variable degerlerini SIFIRLIYORUZ.
        erkekSayisi = 0;
    	kadinSayisi = 0;
    	
    	for(int i = 0 ; i< soruMetinleri.length ; i++) {
    		for (int j = 0 ; j < 3 ; j++) {
        		cevapSayilari[i][j] = 0;
    		}
    	}
    
        String[] anketDizisi = analizYap("src/Anket.txt");
        System.out.println(anketDizisi[3] + "\n");
        
        JLabel[] labelVeriInfo = new JLabel[anketDizisi.length+1];
        labelVeriInfo[0] = new JLabel("Katılımcı sayısı : Erkek " + erkekSayisi + " Kadın " + kadinSayisi);
        labelVeriInfo[0].setFont(font);
        labelVeriInfo[0].setBounds(30, 30, 960, 50);
        
        analizPaneli.add(labelVeriInfo[0]);
        
        int anketSoruPanelYukseklik = 200;
        int anketSoruPanelY = 100;
        int anketSoruPanelFark = 15;
        
        int herSoruPaneliGenislik = 770;
        
        JPanel[] pastaAnketSorusu = new JPanel[soruMetinleri.length];
        
        for(int i=0 ; i< soruMetinleri.length ; i++) {
        	
        	pastaAnketSorusu[i] = new JPanel();
        	pastaAnketSorusu[i] = pastaGrafik(i);
        	pastaAnketSorusu[i].setBounds(30, anketSoruPanelY, herSoruPaneliGenislik, anketSoruPanelYukseklik);
        	
        	analizPaneli.add(pastaAnketSorusu[i]);
        	
        	anketSoruPanelY = anketSoruPanelY + anketSoruPanelYukseklik + anketSoruPanelFark;
        	
        }
        
        
		return analizPaneli;

    }
    
    public static JPanel pastaGrafik(int anketSoruNo) {
    	
    	double a = cevapSayilari[anketSoruNo][0];
    	double b = cevapSayilari[anketSoruNo][1];
    	double c = cevapSayilari[anketSoruNo][2];
    	
    	JPanel panelPasta = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);

                double aGecici = a;
                double bGecici = b;
                double cGecici = c;
                
                double total = aGecici + bGecici + cGecici;

                if (total != 360.0) {
                    // Dilim genişliklerini orantılı olarak ayarla
                    double scale = 360.0 / total;
                    aGecici *= scale;
                    bGecici *= scale;
                    cGecici *= scale;
                }

                int width = getWidth();
                int height = getHeight();
                int diameter = Math.min(width, height) - 10;

                int x = (width - diameter) / 2;
                int y = (height - diameter) / 2;

                int startAngle = 0;

                // Sektor A Kirmizi
                int extent = (int) ((a / total) * 360);
                g.setColor(new Color(204, 20, 62));
                g.fillArc(x, y, diameter, diameter, startAngle, extent);
                startAngle += extent;

                // Sektor B Mavi
                extent = (int) ((b / total) * 360);
                g.setColor(new Color (67, 117, 252));
                g.fillArc(x, y, diameter, diameter, startAngle, extent);
                startAngle += extent;

                // Sektor C Sari
                extent = (int) ((c / total) * 360);
                g.setColor(new Color(242, 226, 5));
                g.fillArc(x, y, diameter, diameter, startAngle, extent);
            }
        };

        panelPasta.setBackground(new Color(203, 231, 248));
        panelPasta.setLayout(null);
        panelPasta.setBounds(0, 0, 200, 200);
        
        Font fontAnketSorusu = new Font("Ubuntu", Font.PLAIN, 25);
        
        JLabel labelAnketSorusu = new JLabel();
        labelAnketSorusu.setFont(fontAnketSorusu);
        labelAnketSorusu.setText(soruMetinleri[anketSoruNo]);
        labelAnketSorusu.setBounds(225, 10, 840, 40);
        
        int renkliKare = 35;
        
        JPanel panelKareKirmizi = new JPanel();
        panelKareKirmizi.setLayout(null);
        panelKareKirmizi.setBackground(new Color(204, 20, 62));
        panelKareKirmizi.setBounds(225, 60, renkliKare, renkliKare);
        
        JPanel panelKareMavi = new JPanel();
        panelKareMavi.setLayout(null);
        panelKareMavi.setBackground(new Color (67, 117, 252));
        panelKareMavi.setBounds(225, 110, renkliKare, renkliKare);
        
        JPanel panelKareSari = new JPanel();
        panelKareSari.setLayout(null);
        panelKareSari.setBackground(new Color(242, 226, 5));
        panelKareSari.setBounds(225, 160, renkliKare, renkliKare);
        
        Font font = new Font("Ubuntu", Font.PLAIN, 30);
        
        double toplam = a+b+c;
        double oran = 0.0;
        String oranMetni = "";
        
        // Kesirli sayı formatını belirleyelim
        DecimalFormat df = new DecimalFormat("#0.00");
        
        oran = (100.0 * a) / toplam;
        oranMetni = df.format(oran);
        
        JLabel labelKirmizi = new JLabel();
        labelKirmizi.setFont(font);
        labelKirmizi.setText(a + " -> %" + oranMetni);
        labelKirmizi.setBounds(285, 50, 300, 50);
        
        oran = (100.0 * b) / toplam;
        oranMetni = df.format(oran);
        
        JLabel labelMavi = new JLabel();
        labelMavi.setFont(font);
        labelMavi.setText(b + " -> %" + oranMetni);
        labelMavi.setBounds(285, 100, 300, 50);
        
        oran = (100.0 * c) / toplam;
        oranMetni = df.format(oran);
        
        JLabel labelSari = new JLabel();
        labelSari.setFont(font);
        labelSari.setText(c + " -> %" + oranMetni);
        labelSari.setBounds(285, 150, 300, 50);

        JPanel panel = new JPanel();
        panel.setLayout(null);
        panel.setBackground(new Color(203, 231, 248));
        
        panel.add(panelPasta);
        
        panel.add(labelAnketSorusu);
        
        panel.add(panelKareKirmizi);
        panel.add(panelKareMavi);
        panel.add(panelKareSari);
        
        panel.add(labelKirmizi);
        panel.add(labelMavi);
        panel.add(labelSari);
        
        panel.setBounds(50, 50, 840, 440);
        
        return panel;
    }

    
    public static String[] analizYap(String dosyaYolu) {
        try (BufferedReader okuyucu = new BufferedReader(new FileReader(dosyaYolu))) {

            String satir;

            while ((satir = okuyucu.readLine()) != null) {

                String[] parcalar = satir.split(",");
                
                // Cinsiyeti kontrol et
                if (parcalar[2].equals("Erkek")) {
                    erkekSayisi++;
                } else if (parcalar[2].equals("Kadın")) {
                    kadinSayisi++;
                }
                
                // Cevaplari al
                for (int i = 3; i < parcalar.length; i++) {
                    if (parcalar[i].equals("Çok İyi")) {
                        cevapSayilari[i - 3][0]++;
                    } else if (parcalar[i].equals("İyi")) {
                        cevapSayilari[i - 3][1]++;
                    } else if (parcalar[i].equals("Kötü")) {
                        cevapSayilari[i - 3][2]++;
                    }
                }

            }

            // Sonuçları oluştur
            sonuclar = new String[soruMetinleri.length];
            
            for (int i = 0; i < soruMetinleri.length; i++) {
                sonuclar[i] = String.format("%s: %d çok iyi, %d iyi, %d kötü",
                        soruMetinleri[i], cevapSayilari[i][0], cevapSayilari[i][1], cevapSayilari[i][2]);
            }
            
            return sonuclar;

        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    public static void main(String[] args) {
        new AnketAnalizPastaGrafik();
    }
}
