/*
 * Copyright 2013-present Facebook, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may
 * not use this file except in compliance with the License. You may obtain
 * a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

package com.facebook.buck.plugin.intellij.ui;

import com.facebook.buck.plugin.intellij.BuckPluginComponent;
import com.google.common.base.Preconditions;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowAnchor;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentFactory;

import java.awt.*;

public class BuckUI {

  public static final String BUCK_TOOL_WINDOW_ID = "Buck";
  public static final String BUCK_MESSAGE_WINDOW_ID = "Message";

  private BuckPluginComponent component;
  private ToolWindow toolWindow;
  private ToolWindow messageWindow;
  private BuckTargetsPanel buckTargetsPanel;
  private BuckProgressPanel buckProgressPanel;

  public BuckUI(BuckPluginComponent component) {
    this.component = Preconditions.checkNotNull(component);
    createToolWindow();
    createMessageWindow();
    createTargetsPanel();
    createProgressPanel();
  }

  private void createToolWindow() {
    ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(component.getProject());
    toolWindow = toolWindowManager.registerToolWindow(BUCK_TOOL_WINDOW_ID,
        false, /* canClose */
        ToolWindowAnchor.RIGHT
    );
    toolWindow.setIcon(AllIcons.Debugger.Threads);
  }

  private void createMessageWindow() {
    ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(component.getProject());
    messageWindow = toolWindowManager.registerToolWindow(BUCK_MESSAGE_WINDOW_ID,
        true, /* canClose */
        ToolWindowAnchor.BOTTOM
    );
    messageWindow.setIcon(AllIcons.Ant.Message);
  }

  private void createTargetsPanel() {
    buckTargetsPanel = new BuckTargetsPanel(component);
    Content content = ContentFactory.SERVICE.getInstance().createContent(
        buckTargetsPanel.getPanel(),
        buckTargetsPanel.DISPLAY_NAME,
        false /* isLockable */
    );
    toolWindow.getContentManager().addContent(content);
  }

  private void createProgressPanel() {
    buckProgressPanel = new BuckProgressPanel();
    Content content = ContentFactory.SERVICE.getInstance().createContent(
        buckProgressPanel.getPanel(),
        buckProgressPanel.DISPLAY_NAME,
        false /* isLockable */
    );
    messageWindow.getContentManager().addContent(content);
  }

  public BuckProgressPanel getProgressPanel() {
    return buckProgressPanel;
  }

  public void showMessageWindow() {
    EventQueue.invokeLater(new Runnable() {
      @Override
      public void run() {
        messageWindow.show(null);
      }
    });
  }

  public void showErrorMessage(String message) {
    Preconditions.checkNotNull(message);
    Messages.showErrorDialog(message, "Buck");
  }

  public void updateTargets() {
    buckTargetsPanel.updateTargets();
  }
}
