package surface;

import client_engine.ClientController;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.logging.Level;
import java.util.logging.Logger;

import hu.swankey.logging.LoggerInitialiser;

/**
 * Az üdvözlő képernyő frissítését végzi csatlakozáskor.
 *
 * @author solusa
 */
public class LoginThread extends Thread {

    /**
     * Osztály története:
     *
     * v804:
     *  Létrehozás
     */

    /** A WelcomeScreen */
    private WelcomeScreen screen;

    /** A CBase */
    private ClientController cbase;

    /** Várakozási idő */
    private int seconds;

    /** Számláló - miközben várakozik a szerver válaszára */
    private int counter = 0;


    /** Constructor */
    public LoginThread (InetSocketAddress address, String name, String pass, WelcomeScreen screen, ClientController cbase, int seconds) throws IOException
    {

		if (screen == null)
			throw new NullPointerException("WelcomeScreen cannot be null");

		if (cbase == null)
			throw new NullPointerException("CBase cannot be null");


        LoggerInitialiser.initLog(LoginThread.class.getName());

        this.screen = screen;
        this.cbase = cbase;
        this.seconds = seconds;

        // Csatlakozás:
        Logger.getLogger(LoginThread.class.getName()).log(Level.INFO, "Connect to " + address + "...");

        if (cbase.connect(address) == false) {
            Logger.getLogger(LoginThread.class.getName()).log(Level.INFO, "Connection failed.");
            screen.loginFailed();
            return;
        }
        Logger.getLogger(LoginThread.class.getName()).log(Level.INFO, "Connection successful.");


        // Bejelentkezés:
        Logger.getLogger(LoginThread.class.getName()).log(Level.INFO, "Login...");
        cbase.login(name, pass);

        // Várakozás a válaszra:
        start();
    }


    /** Futás */
    @Override
    public void run(){

        Logger.getLogger(LoginThread.class.getName()).log(Level.INFO,
                "Waiting for answer... (for "+seconds+" seconds)");

        while (counter < seconds) {


            // Folyamatsáv frissítése:
            screen.setProgressbarValue( (100 / seconds) * counter );

            // Pillantás a kapcsolatra:
            if (cbase.isLoggedIn()) {
                Logger.getLogger(LoginThread.class.getName()).log(Level.INFO, "Login successful.");
                screen.loginSuccess();
                return;
            }


            try {
                sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(LoginThread.class.getName()).log(Level.SEVERE, null, ex);
            }

           counter++;
        }

        screen.setProgressbarValue(100);
        Logger.getLogger(LoginThread.class.getName()).log(Level.INFO, "Login failed.");
        screen.loginFailed();
    }


}
