package fr.Skydust.JdrBot.cmds;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.HashMap;

import fr.Skydust.JdrBot.bases.command.Command;
import fr.Skydust.JdrBot.bases.command.CommandSpec;
import fr.Skydust.JdrBot.utils.DurationUtils;
import net.dv8tion.jda.api.OnlineStatus;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.events.user.update.UserUpdateOnlineStatusEvent;

@CommandSpec(
		name = "lasttimeonline|lto",
		usage = "[Mention]",
		description = "Dit depuis combien de temps un utilisateur est en ligne/hors-ligne"
)
public class LastTimeOnline extends Command {
	static HashMap<Long, LocalDateTime> AllUsers = new HashMap<>();

	@Override
	public void call(MessageReceivedEvent e) {
		if(e.getMessage().getMentions().getUsers().isEmpty()) {
			e.getChannel().sendMessage("Vous n'avez pas mentionne d'utilisateur !").queue();
			return;
		}
		User u = e.getMessage().getMentions().getUsers().get(0);
		if(AllUsers.get(u.getIdLong()) == null) {
			e.getChannel().sendMessage(u.getAsMention()+" n'a pas change d'etat entre le demarrage du bot et maintenant").queue();
			return;
		}

		OnlineStatus status = e.getGuild().getMember(u).getOnlineStatus();
		LocalDateTime UserDate = AllUsers.get(e.getMessage().getMentions().getUsers().get(0).getIdLong());

		StringBuilder sb = new StringBuilder();
		if(status.equals(OnlineStatus.INVISIBLE) || status.equals(OnlineStatus.OFFLINE)) {
			sb.append(u.getAsMention()+" est en hors-ligne depuis ");
		} else {
			sb.append(u.getAsMention()+" est en ligne depuis ");
		}
		sb.append(DurationUtils.formatDurationSmooth(Duration.between(UserDate, LocalDateTime.now())));

		e.getChannel().sendMessage(sb.toString()).queue();
	}

	/** Called from the main Listener */
	public static void onUserUpdateOnlineStatus(UserUpdateOnlineStatusEvent e) {
		if(e.getOldOnlineStatus().equals(OnlineStatus.OFFLINE)) {
			//Si il est en ligne
			AllUsers.put(e.getUser().getIdLong(), LocalDateTime.now());
		} else if(!e.getOldOnlineStatus().equals(OnlineStatus.ONLINE) && !e.getOldOnlineStatus().equals(OnlineStatus.DO_NOT_DISTURB) && !e.getOldOnlineStatus().equals(OnlineStatus.IDLE)) {
			//Si il est hors-ligne
			AllUsers.put(e.getUser().getIdLong(), LocalDateTime.now());
		}
	}

}
