package org.xcolab.client.proposals;
import org.apache.commons.lang3.StringUtils;
import org.xcolab.client.contest.exceptions.ContestNotFoundException;
import org.xcolab.client.contest.pojo.Contest;
import org.xcolab.client.contest.pojo.ContestType;
import org.xcolab.client.contest.pojo.phases.ContestPhase;
import org.xcolab.client.members.pojo.Member;
import org.xcolab.client.proposals.exceptions.ProposalNotFoundException;
import org.xcolab.client.proposals.pojo.Proposal;
import org.xcolab.client.proposals.pojo.ProposalVersion;
import org.xcolab.client.proposals.pojo.group.Group_;
import org.xcolab.client.proposals.pojo.tiers.ProposalReference;
import org.xcolab.util.clients.CoLabService;
import org.xcolab.util.http.ServiceRequestUtils;
import org.xcolab.util.http.client.RestService;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public final class ProposalClientUtil {
private static final RestService proposalService = new RestService(CoLabService.PROPOSAL,
ServiceRequestUtils.getNamespace());
private static final ProposalClient client = ProposalClient.fromService(proposalService);
public static ProposalClient getClient() {
return client;
}
public static Proposal createProposal(
Proposal proposal) {
return client.createProposal(proposal);
}
public static List<Proposal> listProposals(long contestId) {
return client.listProposals(contestId);
}
public static List<Proposal> listProposals(int start, int limit,
Long contestId, Boolean visible, Long contestPhaseId, Integer ribbon) {
return client.listProposals(start, limit, contestId, visible, contestPhaseId, ribbon);
}
public static List<Long> listProposalIds(int start, int limit,
Long contestId, Boolean visible, Long contestPhaseId, Integer ribbon) {
return client.listProposalIds(start, limit, contestId, visible, contestPhaseId, ribbon);
}
public static List<Long> listProposalThreadIds(int start, int limit,
Long contestId, Boolean visible, Long contestPhaseId, Integer ribbon) {
return client.listThreadIds(start, limit, contestId, visible, contestPhaseId, ribbon);
}
public static List<Proposal> getProposalsInContestPhase(
Long contestPhaseId) {
return client.getProposalsInContestPhase(contestPhaseId);
}
public static List<Proposal> getAllProposals() {
return client.getAllProposals();
}
public static List<Proposal> getProposalsInContest(
Long contestPK) {
return client.getProposalsInContest(contestPK);
}
public static List<Member> getProposalMembers(
Long proposalId) {
return client.getProposalMembers(proposalId);
}
public static void removeUserFromProposalTeam(Long proposalId, Long memberUserId) {
client.removeUserFromProposalTeam(proposalId, memberUserId);
}
public static Boolean isUserInProposalTeam(Long proposalId, Long memberUserId) {
return client.isUserInProposalTeam(proposalId, memberUserId);
}
public static List<Proposal> getActiveProposalsInContestPhase(
Long contestPhaseId) {
return client.getActiveProposalsInContestPhase(contestPhaseId);
}
public static Proposal createProposal(long authorId, long contestPhaseId,
boolean publishActivity) {
return client.createProposal(authorId, contestPhaseId, publishActivity);
}
public static List<Proposal> getContestIntegrationRelevantSubproposals(
Long proposalId) {
return client.getContestIntegrationRelevantSubproposals(proposalId);
}
public static List<Proposal> getLinkingProposalsForUser(
long userId) {
return client.getLinkingProposalsForUser(userId);
}
public static List<Proposal> getMemberProposals(
Long userId) {
return client.getMemberProposals(userId);
}
public static List<Proposal> getLinkingProposals(
long proposalId) {
return client.getLinkingProposals(proposalId);
}
public static Proposal getProposal(long proposalId) throws ProposalNotFoundException {
return client.getProposal(proposalId);
}
public static Proposal getProposal(long proposalId,
boolean includeDeleted) throws ProposalNotFoundException {
return client.getProposal(proposalId, includeDeleted);
}
public static List<ProposalReference> getProposalReference(
Long proposalId, Long subProposalId) {
return client.getProposalReference(proposalId, subProposalId);
}
public static List<Proposal> getSubproposals(
Long proposalId, Boolean includeProposalsInSameContest) {
return client.getSubproposals(proposalId, includeProposalsInSameContest);
}
public static Integer getProposalMaterializedPoints(Long proposalId) {
return client.getProposalMaterializedPoints(proposalId);
}
public static Integer getNumberOfProposalsForJudge(Long userId, Long contestPhaseId) {
return client.getNumberOfProposalsForJudge(userId, contestPhaseId);
}
public static ProposalReference getProposalReferenceByProposalIdSubProposalId(
Long proposalId, Long subProposalId) {
return client.getProposalReferenceByProposalIdSubProposalId(proposalId, subProposalId);
}
public static boolean updateProposal(Proposal proposal) {
return client.updateProposal(proposal);
}
public static boolean deleteProposal(long proposalId) {
return client.deleteProposal(proposalId);
}
public static ProposalVersion getProposalVersionByProposalIdVersion(
Long proposalId, Integer version) {
return client.getProposalVersionByProposalIdVersion(proposalId, version);
}
public static List<ProposalVersion> getProposalVersionsGroupedVersionsByContest(Long proposalId, Long contestId, int start , int end) {
return client.getProposalVersionsGroupedVersionsByContest(proposalId,contestId, start, end);
}
public static Integer countProposalVersionsGroupedVersionsByContest(Long proposalId, Long contestId) {
return client.countProposalVersionsGroupedVersionsByContest(proposalId,contestId);
}
public static Integer countProposalVersions(Long proposalId) {
return client.countProposalVersions(proposalId);
}
public static ProposalVersion getProposalVersionByProposal(
Long proposalId) {
return client.getProposalVersionByProposal(proposalId);
}
public static List<ProposalVersion> getAllProposalVersions(
Long proposalId) {
return client.getAllProposalVersions(proposalId);
}
public static ContestType getContestTypeFromProposalId(
Long proposalId) {
return client.getContestTypeFromProposalId(proposalId);
}
public static Contest getCurrentContestForProposal(
Long proposalId) throws ContestNotFoundException {
return client.getCurrentContestForProposal(proposalId);
}
public static Long getLatestContestPhaseIdInProposal(Long proposalId) {
return client.getLatestContestPhaseIdInProposal(proposalId);
}
public static Contest getLatestContestInProposal(Long proposalId)
throws ContestNotFoundException {
return client.getLatestContestInProposal(proposalId);
}
public static ContestPhase getLatestContestPhaseInContest(
Long proposalId) {
return client.getLatestContestPhaseInProposal(proposalId);
}
public static void populateTableWithProposal(long proposalId) {
client.populateTableWithProposal(proposalId);
}
public static boolean isMemberSubscribedToProposal(long proposalId, long userId) {
return client.isMemberSubscribedToProposal(proposalId, userId);
}
public static void subscribeMemberToProposal(long proposalId, long userId) {
client.subscribeMemberToProposal(proposalId, userId);
}
public static void unsubscribeMemberFromProposal(long proposalId, long userId) {
client.unsubscribeMemberFromProposal(proposalId, userId);
}
public static Proposal getProposalFromLinkUrl(String linkUrl) {
List<Long> proposalIds = getProposalIdsFromLinksInText(linkUrl);
if (!proposalIds.isEmpty()) {
try {
return ProposalClientUtil.getProposal(proposalIds.get(0));
} catch (ProposalNotFoundException ignored) {
}
}
return null;
}
public static List<Proposal> getProposalsByCurrentContests(List<Long> contestTypeIds, List<Long> contestTierIds,
String filterText) {
return client.getProposalsByCurrentContests(contestTypeIds, contestTierIds, filterText);
}
public static Group_ createGroup(Group_ group) {
return client.createGroup(group);
}
public static boolean updateGroup(Group_ group) {
return client.updateGroup(group);
}
public static List<Long> getProposalIdsFromLinksInText(String text) {
List<Long> proposalIds = new ArrayList<>();
Pattern proposalLinkPattern = Pattern.compile(
"(href=|https?://).*?/.+?/\\d{4}/[a-z0-9-]+?/(?:c|phase/\\d*)/.+?/(\\d*)");
Matcher m = proposalLinkPattern.matcher(text);
while (m.find()) {
try {
final long proposalId = Long.parseLong(m.group(2));
proposalIds.add(proposalId);
} catch (NumberFormatException ignored) {
}
}
proposalIds.addAll(getProposalIdsFromLegacyLinksInText(text));
return proposalIds;
}
private static List<Long> getProposalIdsFromLegacyLinksInText(String text) {
List<Long> proposalIds = new ArrayList<>();
Pattern proposalLinkPattern = Pattern.compile(
"(href=|https?://).*?/-/plans/contestId/(\\d*)/(?:phaseId/\\d*/)?planId/(\\d*)");
Matcher m = proposalLinkPattern.matcher(text);
while (m.find()) {
try {
final long proposalId = Long.parseLong(m.group(3));
proposalIds.add(proposalId);
} catch (NumberFormatException ignored) {
}
}
return proposalIds;
}
public static String getNonBlankStringOrDefault(String string, String defaultString) {
if (StringUtils.isNotBlank(string)) {
return string;
}
return defaultString;
}
}