package emu.grasscutter.game.player;

import static emu.grasscutter.config.Configuration.*;

import java.util.ArrayList;
import java.util.List;

import dev.morphia.annotations.Entity;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.net.proto.AvatarTeamOuterClass.AvatarTeam;

@Entity
public class TeamInfo {
    private String name;
    private List<Integer> avatars;

    public TeamInfo() {
        this.name = "";
        this.avatars = new ArrayList<>(GAME_OPTIONS.avatarLimits.singlePlayerTeam);
    }

    public TeamInfo(List<Integer> avatars) {
        this.name = "";
        this.avatars = avatars;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Integer> getAvatars() {
        return avatars;
    }

    public int size() {
        return avatars.size();
    }

    public boolean contains(Avatar avatar) {
        return getAvatars().contains(avatar.getAvatarId());
    }

    public boolean addAvatar(Avatar avatar) {
        if (contains(avatar)) {
            return false;
        }

        getAvatars().add(avatar.getAvatarId());

        return true;
    }

    public boolean removeAvatar(int slot) {
        if (size() <= 1) {
            return false;
        }

        getAvatars().remove(slot);

        return true;
    }

    public void copyFrom(TeamInfo team) {
        copyFrom(team, GAME_OPTIONS.avatarLimits.singlePlayerTeam);
    }

    public void copyFrom(TeamInfo team, int maxTeamSize) {
        // Clone avatar ids from team to copy from
        List<Integer> avatarIds = new ArrayList<>(team.getAvatars());

        // Clear current avatar list first
        this.getAvatars().clear();

        // Copy from team
        int len = Math.min(avatarIds.size(), maxTeamSize);
        for (int i = 0; i < len; i++) {
            int id = avatarIds.get(i);
            this.getAvatars().add(id);
        }
    }

    public AvatarTeam toProto(Player player) {
        AvatarTeam.Builder avatarTeam = AvatarTeam.newBuilder()
            .setTeamName(this.getName());

        for (int i = 0; i < this.getAvatars().size(); i++) {
            Avatar avatar = player.getAvatars().getAvatarById(this.getAvatars().get(i));
            avatarTeam.addAvatarGuidList(avatar.getGuid());
        }

        return avatarTeam.build();
    }
}
