package com.mgreau.wildfly.websocket;

import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.ejb.Schedule;
import javax.ejb.Singleton;
import javax.ejb.Startup;

import com.mgreau.wildfly.websocket.messages.MatchMessage;

@Startup
@Singleton
public class StarterService {

    private Random random;
    private Map<String, TennisMatch> matches = new ConcurrentHashMap<>();

    private static final Logger logger = Logger.getLogger("StarterService");

    @PostConstruct
    public void init() {
        logger.log(Level.INFO, "Initializing App.");
        random = new Random();
        matches.put("1234", new TennisMatch("1234", "US OPEN - QUARTER FINALS", "Ferrer D.", "es", "Almagro N.", "es"));
        matches.put("1235", new TennisMatch("1235", "US OPEN - QUARTER FINALS", "Djokovic N.", "rs", "Berdych T.", "cz"));
        matches.put("1236", new TennisMatch("1236", "US OPEN - QUARTER FINALS", "Murray A.", "gb", "Chardy J.", "fr"));
        matches.put("1237", new TennisMatch("1237", "US OPEN - QUARTER FINALS", "Federer R.", "ch", "Tsonga J.W.", "fr"));
    }

    @Schedule(second="*/3", minute="*",hour="*", persistent=false)
    public void play() {
    	for (Map.Entry<String,TennisMatch> match : matches.entrySet()){
    		TennisMatch m = match.getValue();
    		if (m.isFinished()){
    			//add a timer to restart a match after 20 secondes
    			m.reset();
    		}
        	//Handle point
    		if (random.nextInt(2) == 1){
        		m.playerOneScores();
        	} else {
        		m.playerTwoScores();
        	}
        	MatchEndpoint.send(new MatchMessage(m), match.getKey());
        	//if there is a winner, send result and reset the game
        	if (m.isFinished()){
        		MatchEndpoint.sendBetMessages(m.playerWithHighestSets(), match.getKey(), true);
        	}
    	}
    }

    public Map<String, TennisMatch> getMatches(){
    	return matches;
    }
}