package gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.JOptionPane;

import java.io.File;
import java.io.IOException;

import controller.*;
import network.Tools;
import test.App;

public class FenetreInscription implements ActionListener {
	JFrame frame;
    JPanel panel;
    JTextField loginfield;
    JTextField pseudofield;
    JLabel Text;
    JButton inscription;
    JButton connexion;
    
    /*
     * Constructeur d'une fenetre d'affichage pour la connexion d'un utilisateur.
     * Cette fenetre sera munie d'un bouton de connexion et d'une zone de saisie de pseudo.
     */
    public FenetreInscription() {
    	
    	try {
            UIManager.setLookAndFeel("com.jtattoo.plaf.noire.NoireLookAndFeel");
 
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(FenetreMenu.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(FenetreMenu.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(FenetreMenu.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(FenetreMenu.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
    	
		//creer une instance JFrame 
		frame = new JFrame("Fenetre inscription");
		
        //sortir quand l’utilisateur ferme le frame
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// fixer les dimensions de la fenetre 
        frame.setSize(new Dimension(40, 100));
        
        //Creer le JPanel
        panel = new JPanel(new GridLayout(7,1));
        panel.setOpaque(false);
        
        //Ajouter les elements 
        this.addWidgets();
        try {
            final Image backgroundImage = javax.imageio.ImageIO.read(new File("b1.jpg"));
            frame.setContentPane(new JPanel(new BorderLayout()) {
                @Override public void paintComponent(Graphics g) {
                    g.drawImage(backgroundImage, 0, 0, null);
                }
            });
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        frame.getRootPane().setDefaultButton(inscription);
        
        //Ajouter le panel a la window
        frame.getContentPane().add(panel, BorderLayout.CENTER);
        
        //L'utilisateur ne pourra pas agrandir la fenetre
        this.frame.setResizable(false);
        
        //Afficher la fenetre
        frame.pack();
        frame.setVisible(true);
	}
    
    private void addWidgets() {
    	
	 	// Créer Zone d'insertion de texte pour le pseudo
        this.loginfield = new JTextField(2);
        this.pseudofield = new JTextField(2);
        
        // creation d'un label qui contiendra un txt au centre
        this.Text = new JLabel("Forbidden characters: space, '?','&', '/', '=' ", SwingConstants.CENTER); 
        this.Text.setForeground(Color.WHITE);
        this.Text.setOpaque(false);
        JLabel text = new JLabel("Login: ", SwingConstants.CENTER);
        text.setForeground(Color.WHITE);
        text.setOpaque(false);
        loginfield.addKeyListener(new KeyAdapter() {
			public void keyTyped(KeyEvent e) {
				if(e.getKeyChar() =='?' || e.getKeyChar() == '&' || e.getKeyChar() == '/' || e.getKeyChar() =='=' || e.getKeyChar() == KeyEvent.VK_SPACE) {
					e.consume();
				}
			}
		});
        pseudofield.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				if(e.getKeyChar() =='?' || e.getKeyChar() == '&' || e.getKeyChar() == '/' || e.getKeyChar() =='=' ||e.getKeyChar() == KeyEvent.VK_SPACE ) {
					e.consume();
				}
			}
		});
        JLabel text2 = new JLabel("Pseudo: ", SwingConstants.CENTER);
        text2.setForeground(Color.WHITE);
        text2.setOpaque(false);
        
        //Ajout d'un bouton Connexion 
        this.inscription = new JButton("Sign Up");
        this.connexion = new JButton("Sign In");
        
        //On associe au bouton Connexion des actions a realiser
        this.inscription.addActionListener(this);
        this.connexion.addActionListener(this);
        
        // On ajouter les differents elements au panel
        panel.add(text);
        panel.add(loginfield);
        panel.add(text2);
        panel.add(pseudofield);
        panel.add(Text);
        panel.add(inscription);
        panel.add(connexion);
        
        //ajouter un effet de bord transparent au composant Jlabel
        Text.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
 }
    
    public void actionPerformed(ActionEvent event) {
    	Object source = event.getSource();
    	if(source == inscription) {
    		
    		 // on recupere le login et le pseudo entrés dans la zone de saisie
	   		 String login =  loginfield.getText();
	   		 String pseudo = pseudofield.getText();
	   		 
	   		 //Si le login ou le pseudo sont vides affichage message d'erreur
	   		 if(login.isBlank()||pseudo.isBlank()) {
	   			JOptionPane.showMessageDialog(frame, "Please do not enter a blank pseudo or login") ;
	   		
	   		 //Si le login existe déjà on affiche un message d'erreur
	   		 }else if(DataBase.getInstance().loginExiste(login)){
	   			JOptionPane.showMessageDialog(frame, "This login is already used");
	   		
	   		 //Les conditions sont réunies
	   		 }else {
	   			 
		   		Agent agent;
		   		boolean connexion;
		   		 
		   		try {
		   			
		   			//Création d'un agent
		   			agent = new Agent(Tools.getAdress()[0], App.portSrc, App.portDest);
		   			
		   			// on tente une connexion avec le pseudo
		   			connexion = agent.connectInscription(pseudo, login);
		   			
		   			// Dans les deux cas de figures (reussite ou echec) on affiche un pop-up pour expliquer la situation
		   			 if(connexion) {
		   				 
		   				 	// La connexion a reussi
		   					JOptionPane.showMessageDialog(frame, "Bonjour " + pseudo) ;
		   					frame.dispose();
		   					
		   					// on lance une nouvelle fenetre de type View_Menu
		   					FenetreMenu fenetreCourante= new FenetreMenu(agent);
		   			}else {
		   				
		   					// La connexion a echoue, il est possible de rentrer un nouveau pseudo
		   					JOptionPane.showMessageDialog(frame, "Echec de Connexion , ce pseudo est deja pris !");
		   			}
		   			 
		   		} catch (IOException e) {
		   			System.out.println("Création thread impossible");
		   			e.printStackTrace();
		   		} catch (InterruptedException e) {
		   			System.out.println("connect impossible");
		   			e.printStackTrace();
		   		}
		    }
	   		 
    	}else if(source == connexion){
		    	frame.dispose();
		    	FenetreConnexion fenetreCo = new FenetreConnexion();
		}
    }
	   		
    
    public static void createAndShowGUI() {
    	
		 // Etre certain d'avoir une joli fenetre 
	     JFrame.setDefaultLookAndFeelDecorated(true);
	     
	     // On crée une fentre d'acceuil
	     FenetreInscription  fenetre = new FenetreInscription();
	 }
    
    public static void main(String[] args) {

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
