// Path: src/main/java/com/nametagedit/plugin/api/data/FakeTeam.java
// @Data
// public class FakeTeam {
// 
//     // Because some networks use NametagEdit on multiple servers, we may have clashes
//     // with the same Team names. The UNIQUE_ID ensures there will be no clashing.
//     private static final String UNIQUE_ID = Utils.generateUUID();
//     // This represents the number of FakeTeams that have been created.
//     // It is used to generate a unique Team name.
//     private static int ID = 0;
//     private final ArrayList<String> members = new ArrayList<>();
//     private String name;
//     private String prefix;
//     private String suffix;
//     private boolean visible = true;
// 
//     public FakeTeam(String prefix, String suffix, int sortPriority, boolean playerTag) {
//         this.name = UNIQUE_ID + "_" + getNameFromInput(sortPriority) + ++ID + (playerTag ? "+P" : "");
// 
//         switch (VersionChecker.getBukkitVersion()) {
//             case v1_13_R1: case v1_14_R1: case v1_14_R2: case v1_15_R1: case v1_16_R1:
//             case v1_16_R2: case v1_16_R3: case v1_17_R1:
//                 this.name = this.name.length() > 256 ? this.name.substring(0, 256) : this.name;
//             default:
//                 this.name = this.name.length() > 16 ? this.name.substring(0, 16) : this.name;
//         }
// 
//         this.prefix = prefix;
//         this.suffix = suffix;
// 
//     }
// 
//     public void addMember(String player) {
//         if (!members.contains(player)) {
//             members.add(player);
//         }
//     }
// 
//     public boolean isSimilar(String prefix, String suffix, boolean visible) {
//         return this.prefix.equals(prefix) && this.suffix.equals(suffix) && this.visible == visible;
//     }
// 
//     /**
//      * This is a special method to sort nametags in
//      * the tablist. It takes a priority and converts
//      * it to an alphabetic representation to force a
//      * specific sort.
//      *
//      * @param input the sort priority
//      * @return the team name
//      */
//     private String getNameFromInput(int input) {
//         if (input < 0) return "Z";
//         char letter = (char) ((input / 5) + 65);
//         int repeat = input % 5 + 1;
//         StringBuilder builder = new StringBuilder();
//         for (int i = 0; i < repeat; i++) {
//             builder.append(letter);
//         }
//         return builder.toString();
//     }
// 
// }
// 
// Path: src/main/java/com/nametagedit/plugin/api/data/GroupData.java
// @Data
// @AllArgsConstructor
// public class GroupData implements INametag {
// 
//     private String groupName;
//     private String prefix;
//     private String suffix;
//     private String permission;
//     private Permission bukkitPermission;
//     private int sortPriority;
// 
//     public GroupData() {
// 
//     }
// 
//     public void setPermission(String permission) {
//         this.permission = permission;
//         bukkitPermission = new Permission(permission, PermissionDefault.FALSE);
//     }
// 
//     @Override
//     public boolean isPlayerTag() {
//         return false;
//     }
// 
// }
// 
// Path: src/main/java/com/nametagedit/plugin/api/data/Nametag.java
// @Getter
// @Setter
// @AllArgsConstructor
// public class Nametag {
//     private String prefix;
//     private String suffix;
// }


import com.nametagedit.plugin.api.data.FakeTeam;
import com.nametagedit.plugin.api.data.GroupData;
import com.nametagedit.plugin.api.data.Nametag;
import org.bukkit.entity.Player;
import java.util.List;
package com.nametagedit.plugin.api;



/**
 *
 */
public interface INametagApi {

    /**
     * Function gets the fake team data for
     * player.
     *
     * @param player the player to check
     * @return the fake team
     */
    FakeTeam getFakeTeam(Player player);

    /**
     * Function gets the nametag for a player if
     * it exists. This will never return a null.
     *
     * @param player the player to check
     * @return the nametag for the player
     */
// Path: src/main/java/com/nametagedit/plugin/api/data/FakeTeam.java
// @Data
// public class FakeTeam {
// 
//     // Because some networks use NametagEdit on multiple servers, we may have clashes
//     // with the same Team names. The UNIQUE_ID ensures there will be no clashing.
//     private static final String UNIQUE_ID = Utils.generateUUID();
//     // This represents the number of FakeTeams that have been created.
//     // It is used to generate a unique Team name.
//     private static int ID = 0;
//     private final ArrayList<String> members = new ArrayList<>();
//     private String name;
//     private String prefix;
//     private String suffix;
//     private boolean visible = true;
// 
//     public FakeTeam(String prefix, String suffix, int sortPriority, boolean playerTag) {
//         this.name = UNIQUE_ID + "_" + getNameFromInput(sortPriority) + ++ID + (playerTag ? "+P" : "");
// 
//         switch (VersionChecker.getBukkitVersion()) {
//             case v1_13_R1: case v1_14_R1: case v1_14_R2: case v1_15_R1: case v1_16_R1:
//             case v1_16_R2: case v1_16_R3: case v1_17_R1:
//                 this.name = this.name.length() > 256 ? this.name.substring(0, 256) : this.name;
//             default:
//                 this.name = this.name.length() > 16 ? this.name.substring(0, 16) : this.name;
//         }
// 
//         this.prefix = prefix;
//         this.suffix = suffix;
// 
//     }
// 
//     public void addMember(String player) {
//         if (!members.contains(player)) {
//             members.add(player);
//         }
//     }
// 
//     public boolean isSimilar(String prefix, String suffix, boolean visible) {
//         return this.prefix.equals(prefix) && this.suffix.equals(suffix) && this.visible == visible;
//     }
// 
//     /**
//      * This is a special method to sort nametags in
//      * the tablist. It takes a priority and converts
//      * it to an alphabetic representation to force a
//      * specific sort.
//      *
//      * @param input the sort priority
//      * @return the team name
//      */
//     private String getNameFromInput(int input) {
//         if (input < 0) return "Z";
//         char letter = (char) ((input / 5) + 65);
//         int repeat = input % 5 + 1;
//         StringBuilder builder = new StringBuilder();
//         for (int i = 0; i < repeat; i++) {
//             builder.append(letter);
//         }
//         return builder.toString();
//     }
// 
// }
// 
// Path: src/main/java/com/nametagedit/plugin/api/data/GroupData.java
// @Data
// @AllArgsConstructor
// public class GroupData implements INametag {
// 
//     private String groupName;
//     private String prefix;
//     private String suffix;
//     private String permission;
//     private Permission bukkitPermission;
//     private int sortPriority;
// 
//     public GroupData() {
// 
//     }
// 
//     public void setPermission(String permission) {
//         this.permission = permission;
//         bukkitPermission = new Permission(permission, PermissionDefault.FALSE);
//     }
// 
//     @Override
//     public boolean isPlayerTag() {
//         return false;
//     }
// 
// }
// 
// Path: src/main/java/com/nametagedit/plugin/api/data/Nametag.java
// @Getter
// @Setter
// @AllArgsConstructor
// public class Nametag {
//     private String prefix;
//     private String suffix;
// }


// Path: src/main/java/com/nametagedit/plugin/api/INametagApi.java
import com.nametagedit.plugin.api.data.FakeTeam;
import com.nametagedit.plugin.api.data.GroupData;
import com.nametagedit.plugin.api.data.Nametag;
import org.bukkit.entity.Player;
import java.util.List;

package com.nametagedit.plugin.api;



/**
 *
 */
public interface INametagApi {

    /**
     * Function gets the fake team data for
     * player.
     *
     * @param player the player to check
     * @return the fake team
     */
    FakeTeam getFakeTeam(Player player);

    /**
     * Function gets the nametag for a player if
     * it exists. This will never return a null.
     *
     * @param player the player to check
     * @return the nametag for the player
     */
    Nametag getNametag(Player player);