/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package brickbreaker;

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.Timer;

public class Menu extends JPanel {
    private JButton guest;
    private JButton highScore;
    private JScrollPane jScrollPane1;
    private JButton loginButton;
    private JButton registerButton;
    private JTextPane welconText;
    private JFrame frame;
    private Timer animationTimer;
    private int textPosition = -200;
    
    public Menu(JFrame frame) {
        this.frame = frame;
        initComponents();
        initAnimation();
    }

    private void initAnimation() {
        animationTimer = new Timer(10, e -> {
            if (textPosition < 117) { // target Y position for the text
                textPosition += 2;
                jScrollPane1.setLocation(jScrollPane1.getX(), textPosition);
            } else {
                animationTimer.stop();
            }
            repaint();
        });
        animationTimer.start();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        // Gradient background
        Graphics2D g2d = (Graphics2D) g;
        Color color1 = new Color(36, 172, 226);
        Color color2 = new Color(20, 100, 140);
        int w = getWidth();
        int h = getHeight();
        GradientPaint gp = new GradientPaint(0, 0, color1, 0, h, color2);
        g2d.setPaint(gp);
        g2d.fillRect(0, 0, w, h);
        
    }
    
    private void initComponents() {
        loginButton = new javax.swing.JButton();
        registerButton = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        welconText = new javax.swing.JTextPane();
        guest = new javax.swing.JButton();
        highScore = new javax.swing.JButton();

        loginButton.setBackground(new java.awt.Color(36, 172, 226));
        loginButton.setFont(new java.awt.Font("MV Boli", 0, 14)); // NOI18N
        loginButton.setForeground(new java.awt.Color(255, 255, 255));
        loginButton.setToolTipText("login");
        loginButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        loginButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        loginButton.setLabel("Login");

        loginButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                navigateToLogin();
            }
        });
        
        registerButton.setBackground(new java.awt.Color(36, 172, 226));
        registerButton.setFont(new java.awt.Font("MV Boli", 0, 14)); // NOI18N
        registerButton.setForeground(new java.awt.Color(255, 255, 255));
        registerButton.setText("Register");
        registerButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        registerButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);

        welconText.setEditable(false);
        welconText.setBorder(null);
        welconText.setFont(new java.awt.Font("MV Boli", 1, 36)); // NOI18N
        welconText.setForeground(new java.awt.Color(255, 192, 0));
        welconText.setText("Welcome to Brick Breaker");
        welconText.setToolTipText("");
        welconText.setFocusable(false);
        welconText.setOpaque(false);
        jScrollPane1.setViewportView(welconText);
        jScrollPane1.setBorder(BorderFactory.createEmptyBorder());

        registerButton.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                registerButton.setBackground(new Color(20, 100, 140));
            }
            public void mouseExited(java.awt.event.MouseEvent evt) {
                registerButton.setBackground(new Color(36, 172, 226));
            }
        });
        registerButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                registerButtonActionPerformed();
            }
        });
        
        guest.setBackground(new java.awt.Color(36, 172, 226));
        guest.setFont(new java.awt.Font("MV Boli", 0, 14)); // NOI18N
        guest.setForeground(new java.awt.Color(255, 255, 255));
        guest.setActionCommand("play");
        guest.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        guest.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        guest.setLabel("Play Now");
        guest.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                guestActionPerformed(evt);
            }
        });

        highScore.setBackground(new java.awt.Color(36, 172, 226));
        highScore.setFont(new java.awt.Font("MV Boli", 0, 14)); // NOI18N
        highScore.setForeground(new java.awt.Color(255, 255, 255));
        highScore.setText("High Scores");
        highScore.setActionCommand("play");
        highScore.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        highScore.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        highScore.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                highScoreActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(310, 310, 310)
                        .addComponent(loginButton))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(301, 301, 301)
                        .addComponent(registerButton))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(301, 301, 301)
                        .addComponent(guest))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(290, 290, 290)
                        .addComponent(highScore))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(122, 122, 122)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(143, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(117, 117, 117)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(43, 43, 43)
                .addComponent(loginButton)
                .addGap(18, 18, 18)
                .addComponent(registerButton)
                .addGap(18, 18, 18)
                .addComponent(guest)
                .addGap(18, 18, 18)
                .addComponent(highScore)
                .addContainerGap(228, Short.MAX_VALUE))
        );

        frame.add(this);
    }
    
    private void registerButtonActionPerformed() {    
        
        frame.remove(this);
        if(App.registrationPanel == null)
            App.createRegistrationPanel();
        App.registrationPanel.show();
    }                                              

    private void guestActionPerformed(java.awt.event.ActionEvent evt) {                                      
        frame.remove(this);
        if(App.gamePanel == null)
            App.createGame();
        frame.add(App.gamePanel);
        frame.revalidate();
        frame.repaint();
    }                                     

    private void highScoreActionPerformed(java.awt.event.ActionEvent evt) {                                          
        frame.remove(this);
        if(App.highScorePanel == null) 
            App.createHighScorePanel();
        
        frame.add(App.highScorePanel);
        // Refresh and repaint
        frame.revalidate();
        frame.repaint();
    }                                         

    private void navigateToLogin() {
        // Remove current panel
        frame.remove(this);

        LoginFrame loginPage = new LoginFrame(frame);
        frame.add(loginPage);

        // Refresh and repaint
        frame.revalidate();
        frame.repaint();
    }
    
    public void show() {
        
        if(App.user != null) {
            this.remove(loginButton);
            this.remove(registerButton);
        }
        
        frame.add(this);
        frame.revalidate();
        frame.repaint();
    }
}