package com.mobify.astro.plugins;

import android.support.annotation.NonNull;
import android.view.View;
import android.graphics.Color;
import android.support.design.widget.TabLayout;
import android.util.Log;

import com.mobify.astro.AstroActivity;
import com.mobify.astro.AstroPlugin;
import com.mobify.astro.PluginResolver;
import com.mobify.astro.messaging.EventRegistrar;
import com.mobify.astro.messaging.MessageSender;
import com.mobify.astro.messaging.annotations.AsyncRpcMethod;
import com.mobify.astro.messaging.annotations.RpcMethod;
import com.mobify.astro.messaging.RpcResponse;
import com.mobify.astro.utilities.LocaleChangedListener;
import com.mobify.astro.utilities.LocalizationUtilities;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by helen on 2016-06-30.
 */
public class SegmentedPlugin extends AstroPlugin implements LocaleChangedListener  {
    private static final String TAG = SegmentedPlugin.class.getName();

    protected TabLayout layout;
    protected LocalizationUtilities localizationUtilities;

    private Map<String, SegmentData> segmentDataMap = new HashMap<>();

    private class SegmentData {
        private String key;
        private String text;
        private TabLayout.Tab segment;

        private SegmentData(JSONObject data) throws JSONException {
            key = data.getString("key");
            text = data.getString("text");
            segment = layout.newTab();
            segment.setText(localizationUtilities.translate(text));
            segment.setTag(key);
        }
    }

    public SegmentedPlugin(@NonNull AstroActivity activity, @NonNull PluginResolver pluginResolver,
                           @NonNull EventRegistrar eventRegistrar, @NonNull MessageSender messageSender) {
        super(activity, pluginResolver, eventRegistrar, messageSender);

        localizationUtilities = activity.getLocalizationUtilities();
        localizationUtilities.addLocaleChangedListener(this);

        layout = new TabLayout(activity);
        segmentDataMap = new HashMap<>();

        setupListener();
    }

    private void setupListener() {
        layout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                JSONObject params = new JSONObject();
                try {
                    params.put("key", tab.getTag());
                } catch (Exception e) {
                    Log.d(TAG, "Error adding key to JSON object", e);
                }

                triggerEvent("itemSelect", params);
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                // Nothing to do
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                // Nothing to do
            }
        });
    }

    @Override
    public View getView() {
        return layout;
    }

    @RpcMethod(methodName = "setItems", parameterNames = {"items"})
    public void setItems(JSONArray items) throws JSONException {
        layout.removeAllTabs();
        segmentDataMap.clear();
        for(int i = 0; i < items.length(); i++) {
            SegmentData data = new SegmentData(items.getJSONObject(i));
            layout.addTab(data.segment);
            segmentDataMap.put((String) data.segment.getTag(), data);
        }
    }

    @RpcMethod(methodName = "setColor", parameterNames = {"color"})
    public void setColor(String color) {
        // Fetch existing unselected text color to preserve it
        int[] stateList = {android.R.attr.state_empty};
        int normal = layout.getTabTextColors().getColorForState(stateList, 0xFF666666);

        // Set selected tab colors
        int selected = Color.parseColor(color);
        layout.setSelectedTabIndicatorColor(selected);
        layout.setTabTextColors(normal, selected);
    }

    @RpcMethod(methodName = "setInactiveColor", parameterNames = {"color"})
    public void setInactiveColor(String color) {
        // Fetch existing selected text color to preserve it
        int[] stateList = {android.R.attr.state_selected};
        int selected = layout.getTabTextColors().getColorForState(stateList, 0xFF666666);

        // Set unselected tab color
        int normal = Color.parseColor(color);
        layout.setTabTextColors(normal, selected);
    }

    @RpcMethod(methodName = "setBackgroundColor", parameterNames = {"color"})
    public void setBackgroundColor(String color) {
        // Set background color
        int background = Color.parseColor(color);
        layout.setBackgroundColor(background);
    }

    @RpcMethod(methodName = "selectItem", parameterNames = {"key"})
    public void selectItem(String key) {
        segmentDataMap.get(key).segment.select();
    }

    @AsyncRpcMethod(methodName = "getSelectedItem")
    public void getSelectedItem(final RpcResponse response) throws JSONException {
        int index = layout.getSelectedTabPosition();
        String key = (String) layout.getTabAt(index).getTag();
        if (index >= 0) {
            messageSender.sendRpcResponseWithResult(response, key);
        } else {
            messageSender.sendRpcResponseWithError(response, new IndexOutOfBoundsException());
        }
    }

    @Override
    public void localeDidChange() {
        for (SegmentData data : segmentDataMap.values()) {
            data.segment.setText(localizationUtilities.translate(data.text));
        }
        int direction =  localizationUtilities.leftToRight() ? View.LAYOUT_DIRECTION_LTR : View.LAYOUT_DIRECTION_RTL;
        layout.setLayoutDirection(direction);
    }

}
