package net.smoofyuniverse.festivia.listener;

import com.google.inject.Inject;
import net.smoofyuniverse.cardio.text.TextFormatter;
import net.smoofyuniverse.festivia.api.State;
import net.smoofyuniverse.festivia.impl.FestiviaManager;
import net.smoofyuniverse.festivia.impl.GameTeam;
import net.smoofyuniverse.festivia.impl.GameUser;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.filter.cause.Root;
import org.spongepowered.api.event.message.MessageChannelEvent;
import org.spongepowered.api.event.message.MessageEvent.MessageFormatter;
import org.spongepowered.api.text.Text;
import org.spongepowered.api.text.TextTemplate;
import org.spongepowered.api.text.action.TextActions;
import org.spongepowered.api.text.channel.MessageChannel;
import org.spongepowered.api.text.format.TextColors;
import org.spongepowered.api.text.transform.SimpleTextTemplateApplier;

public class ChatListener {
	public static final TextTemplate BODY_CONTENT = TextTemplate.of(TextTemplate.arg("content")),
			HEADER_NAME = TextTemplate.of(TextTemplate.arg("name"), ": "),
			HEADER_TEAM = TextTemplate.of(TextColors.DARK_GRAY, TextActions.showText(Text.of("Précédez le message par ! pour parler à tous.")), "[Equipe] "),
			HEADER_SPEC = TextTemplate.of(TextColors.GRAY, "[Spec] ");

	@Inject
	private FestiviaManager manager;

	@Listener
	public void onPlayerChat(MessageChannelEvent.Chat e, @Root Player p) {
		if (!e.getChannel().isPresent())
			return;

		String content = e.getRawMessage().toPlain().trim();
		GameUser u = GameUser.of(p);

		e.setChannel(MessageChannel.TO_PLAYERS);
		MessageFormatter f = e.getFormatter();
		f.getHeader().clear();
		f.getBody().clear();

		if (!u.inGame())
			f.getHeader().add(new SimpleTextTemplateApplier(HEADER_SPEC)); // Spectator prefix

		if (content.charAt(0) == '!') { // Global chat
			if (content.length() == 1) {
				e.setCancelled(true);
				return;
			}

			content = content.substring(1);
		} else {
			State state = this.manager.getState();
			if (state == State.WAITING || state == State.STARTING || state == State.PLAYING) {
				GameTeam t = u.getTeam().orElse(null);
				if (t != null) { // Team chat
					f.getHeader().add(new SimpleTextTemplateApplier(HEADER_TEAM)); // Team prefix
					e.setChannel(MessageChannel.fixed(t.getUsers()));
				}
			}
		}

		SimpleTextTemplateApplier nameA = new SimpleTextTemplateApplier(HEADER_NAME);
		nameA.setParameter("name", u.getColoredName());
		f.getHeader().add(nameA);

		SimpleTextTemplateApplier contentA = new SimpleTextTemplateApplier(BODY_CONTENT);
		contentA.setParameter("content", TextFormatter.format(p, content));
		f.getBody().add(contentA);
	}
}