package doc.walkthru;

import java.net.URL;
import java.util.List;

import org.benow.java.resource.Publish;
import org.benow.repository.NoSuchObjectException;
import org.benow.repository.mapping.JSQLQuery;

@Publish
public class PerformerServiceImpl implements PerformerService {

  @Override
  public void addGroupMember(Group group, Artist artist) {
    GroupImpl g = (GroupImpl) group;
    g.addMember(artist);
    g.update();
  }

  @Override
  public void addPerformerLink(Performer performer, URL link) {
    PerformerImpl p = (PerformerImpl)performer;
    p.addLink(link);
    p.update();
  }

  @Override
  public Artist createArtist(String name) {
    ArtistImpl a = new ArtistImpl(name);
    a.update();
    return a;
  }

  @Override
  public Group createGroup(String name) {
    GroupImpl g = new GroupImpl(name);
    g.update();
    return g;
  }

  @Override
  public List<Album> getPerformerAlbums(Performer performer) {
    return performer.getDiscography();
  }

  @Override
  public List<Performer> getPerformers() {
    List<Performer> curr = JSQLQuery.getAllObjectsQuery(GroupImpl.class).getObjects();
    curr.addAll(JSQLQuery.getAllObjectsQuery(ArtistImpl.class).getObjects());
    return curr;
  }

  @Override
  public void removePerformerLink(Performer performer, URL link) {
    PerformerImpl p = (PerformerImpl) performer;
    p.removeLink(link);
    p.update();
  }

  @Override
  public Performer getPerformerByKey(Object key, Class<?> type) throws NoSuchObjectException {
    PerformerImpl p = (PerformerImpl) JSQLQuery.getByKeyQuery(type, key).getObject();
    if (p instanceof ArtistImpl)
      ((ArtistImpl) p).getGroups();
    p.getLinks();
    p.getDiscography();
    return p;
  }

}

