package com.earth2me.essentials;

import com.earth2me.essentials.utils.AdventureUtil;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import static com.earth2me.essentials.I18n.tlLiteral;

public class CommandSource {
    protected Essentials ess;
    protected CommandSender sender;

    public CommandSource(final Essentials ess, final CommandSender base) {
        this.ess = ess;
        this.sender = base;
    }

    public final CommandSender getSender() {
        return sender;
    }

    public final Player getPlayer() {
        if (sender instanceof Player) {
            return (Player) sender;
        }
        return null;
    }

    public void sendTl(final String tlKey, final Object... args) {
        if (isPlayer()) {
            //noinspection ConstantConditions
            getUser().sendTl(tlKey, args);
            return;
        }

        final String translation = tlLiteral(tlKey, args);
        sendComponent(AdventureUtil.miniMessage().deserialize(translation));
    }

    public String tl(final String tlKey, final Object... args) {
        if (isPlayer()) {
            //noinspection ConstantConditions
            return getUser().playerTl(tlKey, args);
        }
        return tlLiteral(tlKey, args);
    }

    public Component tlComponent(final String tlKey, final Object... args) {
        if (isPlayer()) {
            //noinspection ConstantConditions
            return getUser().tlComponent(tlKey, args);
        }
        final String translation = tlLiteral(tlKey, args);
        return AdventureUtil.miniMessage().deserialize(translation);
    }

    public void sendComponent(final Component component) {
        final BukkitAudiences audiences = ess.getBukkitAudience();
        audiences.sender(sender).sendMessage(component);
    }

    public final net.ess3.api.IUser getUser() {
        if (sender instanceof Player) {
            return ess.getUser((Player) sender);
        }
        return null;
    }

    public final boolean isPlayer() {
        return sender instanceof Player;
    }

    public final CommandSender setSender(final CommandSender base) {
        return this.sender = base;
    }

    public void sendMessage(final String message) {
        if (!message.isEmpty()) {
            sender.sendMessage(message);
        }
    }

    public boolean isAuthorized(final String permission) {
        //noinspection ConstantConditions
        return !(sender instanceof Player) || getUser().isAuthorized(permission);
    }

    public String getSelfSelector() {
        //noinspection ConstantConditions
        return sender instanceof Player ? getPlayer().getName() : "*";
    }

    public String getDisplayName() {
        //noinspection ConstantConditions
        return sender instanceof Player ? getPlayer().getDisplayName() : getSender().getName();
    }
}
