package jp.android.a.akira.library.okwear;

import android.content.Context;
import android.graphics.Bitmap;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import com.google.android.gms.wearable.Asset;
import com.google.android.gms.wearable.DataApi;
import com.google.android.gms.wearable.MessageApi;
import com.google.android.gms.wearable.Node;

import java.util.List;

import jp.android.a.akira.library.okwear.listener.NodeChangeListener;
import jp.android.a.akira.library.okwear.listener.WearReceiveListener;
import jp.android.a.akira.library.okwear.listener.SendResultListener;
import jp.android.a.akira.library.okwear.util.AssetUtil;
import jp.android.a.akira.library.okwear.util.ParseByteArray;
import jp.android.a.akira.library.okwear.util.Payload;

public class OkWear extends OkWearBase implements MessageApiImpl, DataApiImpl {
    private static final String TAG = OkWear.class.getSimpleName();

    public static final String DEFAULT_MESSAGE_API_PATH = "/path/message/api";
    public static final String DEFAULT_DATA_API_PATH = "/path/data/api";
    public static final String DEFAULT_DATA_API_KEY = "key_data_api";

    public OkWear(final Context context) {
        super(context);
    }

    public OkWear(final Context context, final WearReceiveListener listener) {
        super(context, listener);
    }

    public void sendMessageAll(@Nullable final String payload, @Nullable final String path) {
        sendMessageAll(ParseByteArray.fromString(payload), path, null);
    }

    public void sendMessageAll(@Nullable final int payload, @Nullable final String path) {
        sendMessageAll(ParseByteArray.fromInt(payload), path, null);
    }

    public void sendMessageAll(@Nullable final double payload, @Nullable final String path) {
        sendMessageAll(ParseByteArray.fromDouble(payload), path, null);
    }

    @Override
    public void sendMessageAll(@Nullable final byte[] payload, @Nullable final String path) {
        sendMessageAll(payload, path, null);
    }

    @Override
    public void sendMessageAll(@Nullable final byte[] payload, @Nullable String path,
                               @Nullable final SendResultListener<MessageApi.SendMessageResult> listener) {
        if (path == null) {
            path = DEFAULT_MESSAGE_API_PATH;
        }
        final String finalPath = path;
        mHelper.getNodes(new NodeChangeListener() {
            @Override
            public void onReceiveNodes(List<Node> nodes) {
                for (Node node : nodes) {
                    sendMessage(node, payload, finalPath, listener);
                }
            }
        });
    }

    @Override
    public void sendMessageAllAsync(@Nullable final byte[] payload, @Nullable final String path) {
        sendMessageAllAsync(payload, path, null);
    }

    @Override
    public void sendMessageAllAsync(@Nullable final byte[] payload, @Nullable String path,
                                    @Nullable final SendResultListener<MessageApi.SendMessageResult> listener) {
        if (path == null) {
            path = DEFAULT_MESSAGE_API_PATH;
        }
        final String finalPath = path;
        mHelper.getNodes(new NodeChangeListener() {
            @Override
            public void onReceiveNodes(List<Node> nodes) {
                for (Node node : nodes) {
                    sendMessageAsync(node, payload, finalPath, listener);
                }
            }
        });
    }

    @Override
    public void sendMessage(@NonNull final Node node, @Nullable final byte[] payload, @Nullable final String path) {
        sendMessage(node, payload, path, null);
    }

    @Override
    public void sendMessage(@NonNull final Node node, @Nullable final byte[] payload,
                            @Nullable String path, @Nullable final SendResultListener<MessageApi.SendMessageResult> listener) {
        if (path == null) {
            path = DEFAULT_MESSAGE_API_PATH;
        }
        mHelper.sendMessage(node, payload, path, listener);
    }

    @Override
    public void sendMessageAsync(@NonNull final Node node, @Nullable final byte[] payload, @Nullable final String path) {
        sendMessageAsync(node, payload, path, null);
    }

    @Override
    public void sendMessageAsync(@NonNull final Node node, @Nullable final byte[] payload,
                                 @Nullable String path, @Nullable final SendResultListener<MessageApi.SendMessageResult> listener) {
        if (path == null) {
            path = DEFAULT_MESSAGE_API_PATH;
        }
        mHelper.sendMessageAsync(node, payload, path, listener);
    }

    public void syncData(@NonNull final String path, @NonNull final String key, @NonNull final String data) {
        final Payload payload =
                new Payload.Builder(path)
                        .addPayload(key, data)
                        .build();
        syncData(payload, null);
    }

    public void syncData(@NonNull final String path, @NonNull final String key, @NonNull final int data) {
        final Payload payload =
                new Payload.Builder(path)
                        .addPayload(key, data)
                        .build();
        syncData(payload, null);
    }

    public void syncData(@NonNull final String path, @NonNull final String key, @NonNull final double data) {
        final Payload payload =
                new Payload.Builder(path)
                        .addPayload(key, data)
                        .build();
        syncData(payload, null);
    }

    @Override
    public void syncData(@NonNull final Payload payload) {
        syncData(payload, null);
    }

    @Override
    public void syncData(@NonNull final Payload payload, @Nullable final SendResultListener<DataApi.DataItemResult> listener) {
        mHelper.syncData(payload.getPutDataRequest(), listener);
    }

    @Override
    public void syncDataAsync(@NonNull final Payload payload) {
        syncDataAsync(payload, null);
    }

    @Override
    public void syncDataAsync(@NonNull final Payload payload, @Nullable final SendResultListener<DataApi.DataItemResult> listener) {
        mHelper.syncDataAsync(payload.getPutDataRequest(), listener);
    }

    /**
     * load bitmap from asset
     *
     * @param asset
     * @return
     */
    public Bitmap loadBitmap(@NonNull final Asset asset) {
        return AssetUtil.loadBitmapFromAsset(asset, mHelper.getGoogleApiClient());
    }

}