package org.poopki.duckdns.user_db.Array;

import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.poopki.duckdns.user_db.UserInfoArray;

import java.util.UUID;

public class GroupEventHandler implements CommandExecutor {

    GroupArray m_GroupArray;
    UserInfoArray m_UserInfoArray;
    AccountArray m_AccountArray;
    UUID ZERO_UUID = new UUID(0,0);

    String m_GroupType;
    String m_Type;
    public GroupEventHandler(GroupArray GA, UserInfoArray UIA, AccountArray AA, String GroupType, String Type){
        m_GroupArray = GA;
        m_UserInfoArray = UIA;
        m_GroupType = GroupType;
        m_Type=Type;
        m_AccountArray = AA;
    }
    public static boolean isStringDouble(String s) {
        try {
            Double.parseDouble(s);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        Player p = (Player) sender;

        if (args.length != 0) {
            switch (args[0]) {
                case "생성":{
                    UUID tempUUID = UUID.randomUUID();
                    if(m_UserInfoArray.getUserGroupUUID(p.getUniqueId(), m_Type).equals(ZERO_UUID)){
                        if(m_GroupArray.CreateGroup(tempUUID, args[1], p.getUniqueId())){
                            m_UserInfoArray.setUserGroupUUID(m_Type,p.getUniqueId(), tempUUID);
                            m_AccountArray.putAccountInfo(tempUUID,0);
                            p.sendMessage(args[1]+m_GroupType+"이 생성되었습니다.");
                            p.sendMessage(m_GroupType+" 멤버 목록: ");
                            for (String Name: m_GroupArray.GetGroupMembersName(tempUUID)){
                                p.sendMessage(Name);
                            }
                            p.sendMessage(m_GroupType+" 목록:");
                            for (String Name: m_GroupArray.GetGroupNameList()){
                                p.sendMessage(Name);
                            }
                        }
                        else{
                            p.sendMessage("이미 존재하는 "+m_GroupType+" 이름입니다.");
                        }
                    }
                    else{
                        p.sendMessage("이미"+m_GroupType+"을(를) 소유중입니다."+m_UserInfoArray.getUserGroupUUID(p.getUniqueId(), m_Type));
                    }
                    break;
                }
                case "가입":{
                    p.sendMessage("플레이어 UUID:"+p.getUniqueId()+"  농장 UUID:"+m_UserInfoArray.getUserGroupUUID(p.getUniqueId(), m_Type));
                    p.sendMessage("ZERO UUID:"+ZERO_UUID);
                    if(!m_UserInfoArray.getUserGroupUUID(p.getUniqueId(), m_Type).equals(ZERO_UUID)){
                        p.sendMessage("이미 가입한 "+m_GroupType+"이(가) 존재합니다.");
                    }
                    else{
                        p.sendMessage("가입 완료");
                        m_GroupArray.SignUpGroup(m_Type,m_GroupArray.m_GroupNameList.get(args[1]),p.getUniqueId());
                        p.sendMessage(m_GroupType+" 멤버 목록: ");
                        for (String Name: m_GroupArray.GetGroupMembersName(m_GroupArray.m_GroupNameList.get(args[1]))){
                            p.sendMessage(Name);
                        }
                        p.sendMessage(m_GroupType+" 목록:");
                        for (String Name: m_GroupArray.GetGroupNameList()){
                            p.sendMessage(Name);
                        }
                    }
                    break;
                }
                case "초대":{
                    p.sendMessage("초대 테스트");
                    break;
                }
                case "강퇴":{
                    p.sendMessage("강퇴 테스트");
                    if(m_UserInfoArray.getUserGroupUUID(p.getUniqueId(), m_Type).equals(ZERO_UUID)){
                        p.sendMessage("가입한 "+m_GroupType+"이(가) 없습니다."+m_UserInfoArray.getUserGroupUUID(p.getUniqueId(), m_Type));
                    }
                    else{
                        if(m_GroupArray.isOwner(m_UserInfoArray.getUserGroupUUID(p.getUniqueId(), m_Type), p.getUniqueId())){
                            if (args.length > 1) {
                                Player op = Bukkit.getPlayer(args[1]);
                                if (op != null) {
                                    if(m_GroupArray.isGroupMember(m_UserInfoArray.getUserGroupUUID(p.getUniqueId(), m_Type),op.getUniqueId())) {
                                        m_GroupArray.ExpulsionGroupPlayer(m_Type, m_UserInfoArray.getUserGroupUUID(p.getUniqueId(), m_Type), p.getUniqueId());
                                    }
                                    else{
                                        p.sendMessage(m_GroupType+"에 가입되지 않은 유저입니다");
                                    }
                                }
                                else{
                                    p.sendMessage("잘못된 대상입니다.");
                                }
                            }
                            else{
                                p.sendMessage("강퇴할 대상을 지정");
                            }
                        }
                        else{
                            p.sendMessage(m_GroupType+"주만 사용 가능한 명령어입니다."+ p.getUniqueId());
                        }
                    }
                    break;
                }
                case "탈퇴": {
                    if(m_UserInfoArray.getUserGroupUUID(p.getUniqueId(), m_Type).equals(ZERO_UUID)){
                        p.sendMessage("가입한 "+m_GroupType+"이(가) 없습니다."+m_UserInfoArray.getUserGroupUUID(p.getUniqueId(), m_Type));
                    }
                    else{
                        p.sendMessage("탈퇴 플레이어 UUID:"+p.getUniqueId()+m_GroupType+" UUID:"+m_UserInfoArray.getUserGroupUUID(p.getUniqueId(), m_Type));
                        m_GroupArray.ExpulsionGroupPlayer(m_Type,m_UserInfoArray.getUserGroupUUID(p.getUniqueId(),m_Type),p.getUniqueId());

                    }
                    break;
                }
                case "이름":{
                    p.sendMessage("현재 "+m_GroupType+" 이름"+m_GroupArray.GetGroupName(m_UserInfoArray.getUserGroupUUID(p.getUniqueId(),"Party")));
                    break;
                }
                case "정보": {
                    for (String Name: m_GroupArray.GetGroupNameList()){
                        p.sendMessage(m_GroupType+" 이름:");
                        p.sendMessage(Name);
                        p.sendMessage("인원 목록");
                        for (String Name2: m_GroupArray.GetGroupMembersName(m_GroupArray.m_GroupNameList.get(Name))) {
                            p.sendMessage(Name2);
                        }
                        p.sendMessage("계좌 잔액:"+m_AccountArray.getAccountInfo(m_GroupArray.m_GroupNameList.get(Name)));
                    }
                }
                case "계좌설정":{
                    if (p.isOp()) {
                        if (args.length > 1) {
                            if (args[1] != null) {
                                UUID op = m_GroupArray.m_GroupNameList.get(args[1]);
                                if (op != null) {
                                    if (args.length > 2) {
                                        if (isStringDouble(args[2])) {
                                            if(m_AccountArray.setAccountInfo(op, Long.parseLong(args[2]))){
                                                p.sendMessage(args[1] + "님의 잔액을 " + Integer.parseInt(args[2]) + "원으로 설정하였습니다.");
                                            } else{
                                                p.sendMessage("최대 금액 이상으로 설정할 수 없습니다.");
                                            }
                                        } else {
                                            p.sendMessage("설정 금액은 숫자만 가능합니다.");
                                        }
                                    } else {
                                        p.sendMessage("설정 금액을 입력해주세요.");
                                    }
                                } else {
                                    p.sendMessage("잘못된 계좌입니다.");
                                }
                            }
                        }else{
                            p.sendMessage("설정 대상이 지정되지 않았습니다.");
                        }
                    } else {
                        p.sendMessage("관리자만 실행 가능한 명령어입니다.");
                    }
                    break;
                }
                case "입금": {
                    if (args.length > 1) {
                        if(args.length > 2) {
                            UUID op = m_GroupArray.m_GroupNameList.get(args[1]);
                            if (op != null) {
                                if (isStringDouble(args[2])) {
                                    if(p.getUniqueId() != op) {
                                        switch(m_AccountArray.transfer(p.getUniqueId(), op, Long.parseLong(args[2])))
                                        {
                                            case 1: {
                                                p.sendMessage(args[1] + m_GroupType+"에 " + Integer.parseInt(args[2]) + "원을 이체하였습니다.");
                                                break;
                                            }
                                            case 2: {
                                                p.sendMessage("잔액은 최대 금액을 초과할 수 없습니다.");
                                                break;
                                            }
                                            case 3:{
                                                p.sendMessage("잔액이 부족합니다.");
                                                break;
                                            }
                                        }
                                    } else{
                                        p.sendMessage("자기 자신에게는 이체할 수 없습니다.");
                                    }
                                } else {
                                    p.sendMessage("이체 금액은 숫자만 가능합니다.");
                                }
                            } else {
                                p.sendMessage("잘못된 계좌입니다.");
                            }
                        } else {
                            p.sendMessage("이체 금액을 입력해주세요.");
                        }
                    } else {
                        p.sendMessage("이체 대상이 지정되지 않았습니다.");
                    }
                    break;
                }
                case "출금": {
                    if (args.length > 1) {
                        if(args.length > 2) {
                            UUID op = m_GroupArray.m_GroupNameList.get(args[1]);
                            if (op != null) {
                                if (isStringDouble(args[2])) {
                                    if(p.getUniqueId() != op) {
                                        switch(m_AccountArray.transfer(op,p.getUniqueId(), Long.parseLong(args[2])))
                                        {
                                            case 1: {
                                                p.sendMessage(args[1] + m_GroupType+"에서 " + Integer.parseInt(args[2]) + "원을 출금하였습니다.");
                                                break;
                                            }
                                            case 2: {
                                                p.sendMessage("잔액은 최대 금액을 초과할 수 없습니다.");
                                                break;
                                            }
                                            case 3:{
                                                p.sendMessage("잔액이 부족합니다.");
                                                break;
                                            }
                                        }
                                    } else{
                                        p.sendMessage("자기 자신에게는 이체할 수 없습니다.");
                                    }
                                } else {
                                    p.sendMessage("이체 금액은 숫자만 가능합니다.");
                                }
                            } else {
                                p.sendMessage("잘못된 계좌입니다.");
                            }
                        } else {
                            p.sendMessage("이체 금액을 입력해주세요.");
                        }
                    } else {
                        p.sendMessage("이체 대상이 지정되지 않았습니다.");
                    }
                    break;
                }
                case "잔액": {
                    p.sendMessage("==잔액: " + m_AccountArray.getAccountInfo(m_GroupArray.GetUUID(args[1]))+ "원==");
                    break;
                }
                default: {
                    p.sendMessage("잘못된 명령어");
                }
            }
        }
        return true;
    }
}