package com.yoghurt.crypto.transactions.client.ui;

import com.google.gwt.core.shared.GWT;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import com.yoghurt.crypto.transactions.client.place.AddressPlace;
import com.yoghurt.crypto.transactions.client.util.address.AddressEncodeUtil;
import com.yoghurt.crypto.transactions.client.util.address.AddressParseUtil;
import com.yoghurt.crypto.transactions.client.util.address.Base58;
import com.yoghurt.crypto.transactions.shared.domain.AddressInformation;
import com.yoghurt.crypto.transactions.shared.domain.Base58CheckContents;
import com.yoghurt.crypto.transactions.shared.service.BlockchainRetrievalServiceAsync;

public class AddressActivity extends LazyLookupActivity<AddressInformation, AddressPlace> implements AddressView.Presenter {
  private final AddressView view;

  private Base58CheckContents address;

  @Inject
  public AddressActivity(final AddressView view, @Assisted final AddressPlace place, final BlockchainRetrievalServiceAsync service) {
    super(place, service);
    this.view = view;
  }

  @Override
  public void start(final AcceptsOneWidget panel, final EventBus eventBus) {
    address = AddressParseUtil.parseAddress(place.getPayload());

    panel.setWidget(view);

    if(address == null) {
      return;
    }

    view.setAddress(address);

    super.start(panel, eventBus);
  }

  @Override
  protected void doLookup(final AddressPlace place, final AsyncCallback<AddressInformation> callback) {
    final String addressString = Base58.encode(AddressEncodeUtil.encodeAddress(address));
    service.getAddressInformation(addressString, callback);
  }

  @Override
  protected void doDeferredError(final AcceptsOneWidget panel, final Throwable caught) {
    // Not supported
    GWT.log("boohoo " + caught.getMessage());
  }

  @Override
  protected void doDeferredStart(final AcceptsOneWidget panel, final AddressInformation info) {
    GWT.log("yay?");
    view.setAddressInformation(info);
  }
}