/*
 *  nextpnr -- Next Generation Place and Route
 *
 *  Copyright (C) 2018  Miodrag Milanovic <miodrag@symbioticeda.com>
 *
 *  Permission to use, copy, modify, and/or distribute this software for any
 *  purpose with or without fee is hereby granted, provided that the above
 *  copyright notice and this permission notice appear in all copies.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 */

#ifndef BASEMAINWINDOW_H
#define BASEMAINWINDOW_H

#include "command.h"
#include "nextpnr.h"
#include "worker.h"

#include <QMainWindow>
#include <QMenu>
#include <QMenuBar>
#include <QProgressBar>
#include <QStatusBar>
#include <QTabWidget>
#include <QToolBar>

Q_DECLARE_METATYPE(std::string)
Q_DECLARE_METATYPE(NEXTPNR_NAMESPACE_PREFIX DecalXY)

NEXTPNR_NAMESPACE_BEGIN

class PythonTab;
class DesignWidget;
class FPGAViewWidget;

class BaseMainWindow : public QMainWindow
{
    Q_OBJECT

  public:
    explicit BaseMainWindow(std::unique_ptr<Context> context, CommandHandler *handler, QWidget *parent = 0);
    virtual ~BaseMainWindow();
    Context *getContext() { return ctx.get(); }
    void updateActions();

    void notifyChangeContext();

  protected:
    void createMenusAndBars();
    void disableActions();

    virtual void onDisableActions(){};
    virtual void onUpdateActions(){};

  protected Q_SLOTS:
    void writeInfo(std::string text);
    void closeTab(int index);

    virtual void new_proj() = 0;

    void open_json();
    void save_json();
    void budget();
    void place();

    void execute_python();

    void pack_finished(bool status);
    void budget_finish(bool status);
    void place_finished(bool status);
    void route_finished(bool status);

    void taskCanceled();
    void taskStarted();
    void taskPaused();

  Q_SIGNALS:
    void contextChanged(Context *ctx);
    void updateTreeView();

  protected:
    // state variables
    CommandHandler *handler;
    std::unique_ptr<Context> ctx;
    TaskManager *task;
    bool timing_driven;
    std::string currentProj;

    // main widgets
    QTabWidget *tabWidget;
    QTabWidget *centralTabWidget;
    PythonTab *console;
    DesignWidget *designview;
    FPGAViewWidget *fpgaView;

    // Menus, bars and actions
    QMenuBar *menuBar;
    QMenu *menuDesign;
    QStatusBar *statusBar;
    QToolBar *mainActionBar;
    QProgressBar *progressBar;

    QAction *actionNew;
    QAction *actionLoadJSON;
    QAction *actionSaveJSON;

    QAction *actionPack;
    QAction *actionAssignBudget;
    QAction *actionPlace;
    QAction *actionRoute;

    QAction *actionExecutePy;

    QAction *actionPlay;
    QAction *actionPause;
    QAction *actionStop;
};

NEXTPNR_NAMESPACE_END

#endif // BASEMAINWINDOW_H
