package com.vaguehope.onosendai.provider;
import java.util.Collections;
import com.vaguehope.onosendai.config.Account;
import com.vaguehope.onosendai.model.Meta;
import com.vaguehope.onosendai.model.MetaType;
import com.vaguehope.onosendai.model.OutboxTweet;
import com.vaguehope.onosendai.model.OutboxTweet.OutboxAction;
import com.vaguehope.onosendai.model.Tweet;
public final class OutboxActionFactory {
private OutboxActionFactory () {
throw new AssertionError();
}
public static OutboxTweet newRt (final Account account, final Tweet tweet) {
return newAction(OutboxAction.RT, account, tweet.getSid(), tweet);
}
public static OutboxTweet newFav (final Account account, final Tweet tweet) {
return newAction(OutboxAction.FAV, account, tweet.getSid(), tweet);
}
public static OutboxTweet newDelete (final Account account, final Tweet tweet) {
final Meta editSidMeta = tweet.getFirstMetaOfType(MetaType.EDIT_SID);
if (editSidMeta == null) throw new IllegalStateException("Tried to delete a tweet with out EDIT_SID set: " + tweet);
final String editSid = editSidMeta.getData();
return newAction(OutboxAction.DELETE, account, editSid, tweet);
}
private static OutboxTweet newAction (final OutboxAction action, final Account account, final String sid, final Tweet tweet) {
switch (account.getProvider()) {
case TWITTER:
return new OutboxTweet(action, account, null, actionBody(action, tweet), sid, null)
.setPending();
case SUCCESSWHALE:
final Meta svcMeta = tweet.getFirstMetaOfType(MetaType.SERVICE);
if (svcMeta != null) {
final ServiceRef svc = ServiceRef.parseServiceMeta(svcMeta);
if (svc != null) {
return new OutboxTweet(action, account, Collections.singleton(svc), actionBody(action, tweet), sid, null)
.setPending();
}
throw new IllegalStateException("Invalid service metadata: " + svcMeta.getData());
}
throw new IllegalStateException("Service metadata missing from: " + tweet);
default:
throw new UnsupportedOperationException("Do not know how to RT via account type: " + account.getUiTitle());
}
}
private static String actionBody (final OutboxAction action, final Tweet tweet) {
return String.format("%s:\n%s", action, tweet.getBody());
}
}