package samuelb.capripol.Services;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import samuelb.capripol.Group;
import samuelb.capripol.Repositories.GroupRepository;
import samuelb.capripol.Repositories.UserRepository;
import samuelb.capripol.Focus;
import samuelb.capripol.User;

import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;

@Service
public class GroupService implements IGroupService{

    private UserRepository userRepository;
    private GroupRepository groupRepository;

    @Autowired
    public GroupService(GroupRepository groupRepository){
        this.groupRepository = groupRepository;
    }

    @Override
    public Optional<Group> findByID(Long id) {
        return groupRepository.findById(id);
    }

    public List<Group> findByUserID(Long id){
        return groupRepository.findByUserID(id);
    }

    public Group findByGroupName(String groupName) {
        return groupRepository.findByGroupName(groupName);
    }

    public Set<Group> findGroups(String[] groups){
        Set<Group> groupList = new HashSet<>();
        for(String group: groups){
            Group myGroup = groupRepository.findByGroupName(group);
            if(myGroup != null){
                groupList.add(myGroup);
            }
        }
        return groupList;
    }

    public void saveGroup(Group group){
        groupRepository.save(group);
    }

    public boolean contains(Group group){ return groupRepository.findByGroupName(group.getGroupName()) != null; }

    public boolean hasFocus(String groupName, String focusName){
        for(Focus focus: groupRepository.findByGroupName(groupName).getFramework().getFrameworkFoci()) {
            if(focus.getFocusName().equals(focusName)){
                return true;
            }
        }
        return false;
    }

    public String groupsToString(Long userID){
        String outputGroups = "";
        int count = 0;
        List<Group> groups = findByUserID(userID);
        if(groups != null){
            for(Group group: groups){
                if(count >= 1){
                    outputGroups += ", ";
                }
                outputGroups += group.getGroupName();
                count++;
            }
        }else{
            outputGroups = "None";
        }
        return outputGroups;
    }

    public String[] getGroupData(String groupName){
        Group group = findByGroupName(groupName);
        String[] groupDetails = {};
        if(group.getFramework() == null){
            groupDetails = new String[]{group.getGroupName(), group.groupMembersToString(), "None", "None"};
        }else{
            groupDetails = new String[]{group.getGroupName(), group.groupMembersToString(), group.getFramework().getFrameworkName(), group.getFramework().fociToString()};
        }
        return groupDetails;
    }

//    public void saveUser(User user, String role) {
//        user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
//        user.setRoles(new HashSet<>(roleRepository.findAll()));
//        userRepository.save(user);
//    }
}