package autotest.afe;

import autotest.common.JsonRpcCallback;
import autotest.common.JsonRpcProxy;
import autotest.common.StaticDataRepository;
import autotest.common.StaticDataRepository.FinishedCallback;
import autotest.common.Utils;
import autotest.common.ui.RadioChooser;
import autotest.common.ui.RadioChooserDisplay;
import autotest.common.ui.TabView;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.json.client.JSONBoolean;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTMLTable;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

public class UserPreferencesView extends TabView implements ClickHandler {
    private static final StaticDataRepository staticData = StaticDataRepository.getRepository();
    private static final JsonRpcProxy proxy = JsonRpcProxy.getProxy();

    public static interface UserPreferencesListener {
        public void onPreferencesChanged();
    }

    private JSONObject user;
    private UserPreferencesListener listener;

    private RadioChooser rebootBefore = new RadioChooser();
    private RadioChooser rebootAfter = new RadioChooser();
    private ListBox droneSet = new ListBox();
    private CheckBox showExperimental = new CheckBox();
    private Button saveButton = new Button("Save preferences");
    private HTMLTable preferencesTable = new FlexTable();

    public UserPreferencesView(UserPreferencesListener listener) {
        this.listener = listener;
    }

    @Override
    public String getElementId() {
        return "user_preferences";
    }

    @Override
    public void initialize() {
        super.initialize();

        RadioChooserDisplay rebootBeforeDisplay = new RadioChooserDisplay();
        RadioChooserDisplay rebootAfterDisplay = new RadioChooserDisplay();
        rebootBefore.bindDisplay(rebootBeforeDisplay);
        rebootAfter.bindDisplay(rebootAfterDisplay);

        Panel container = new VerticalPanel();
        AfeUtils.populateRadioChooser(rebootBefore, "reboot_before");
        AfeUtils.populateRadioChooser(rebootAfter, "reboot_after");

        saveButton.addClickHandler(this);

        addOption("Reboot before", rebootBeforeDisplay);
        addOption("Reboot after", rebootAfterDisplay);
        addOption("Show experimental tests", showExperimental);
        if (staticData.getData("drone_sets_enabled").isBoolean().booleanValue()) {
            AfeUtils.populateListBox(droneSet, "drone_sets");
            addOption("Drone set", droneSet);
        }

        container.add(preferencesTable);
        container.add(saveButton);
        addWidget(container, "user_preferences_table");
    }

    @Override
    public void refresh() {
        staticData.refresh(new FinishedCallback() {
            public void onFinished() {
                user = staticData.getData("current_user").isObject();
                updateValues();
                if (listener != null) {
                    listener.onPreferencesChanged();
                }
            }
        });
    }

    private void updateValues() {
        rebootBefore.setSelectedChoice(getValue("reboot_before"));
        rebootAfter.setSelectedChoice(getValue("reboot_after"));
        AfeUtils.setSelectedItem(droneSet, getValue("drone_set"));

        showExperimental.setValue(user.get("show_experimental").isBoolean().booleanValue());
    }

    private String getValue(String key) {
        return Utils.jsonToString(user.get(key));
    }

    public void onClick(ClickEvent event) {
        assert event.getSource() == saveButton;
        saveValues();
    }

    private void saveValues() {
        JSONObject values = new JSONObject();
        values.put("id", user.get("id"));
        values.put("reboot_before", new JSONString(rebootBefore.getSelectedChoice()));
        values.put("reboot_after", new JSONString(rebootAfter.getSelectedChoice()));
        if (staticData.getData("drone_sets_enabled").isBoolean().booleanValue()) {
          values.put("drone_set", new JSONString(droneSet.getItemText(droneSet.getSelectedIndex())));
        }
        values.put("show_experimental", JSONBoolean.getInstance(showExperimental.getValue()));
        proxy.rpcCall("modify_user", values, new JsonRpcCallback() {
            @Override
            public void onSuccess(JSONValue result) {
                refresh();
            }
        });
    }

    private void addOption(String name, Widget widget) {
        int row = preferencesTable.getRowCount();
        preferencesTable.setText(row, 0, name);
        preferencesTable.setWidget(row, 1, widget);
    }
}
