//===========================================
//  Lumina-DE source code
//  Copyright (c) 2015, Ken Moore
//  Available under the 3-clause BSD license
//  See the LICENSE file for full details
//===========================================
#ifndef _LUMINA_FM_DIRECTORY_BROWSER_WIDGET_H
#define _LUMINA_FM_DIRECTORY_BROWSER_WIDGET_H

#include <QList>
#include <QWidget>
#include <QObject>
#include <QMenu>
#include <QToolBar>
#include <QLineEdit>
#include <QShortcut>
#include <QFileSystemWatcher>
#include <QFileSystemModel>
#include <QTimer>
#include <QFuture>

#include "../BrowserWidget.h"


#define ZSNAPDIR QString("/.zfs/snapshot/")

namespace Ui{
    class DirWidget;
};

class DirWidget : public QWidget{
    Q_OBJECT
public:
    enum DETAILTYPES{ NAME, SIZE, TYPE, DATEMOD, DATECREATE};
    DirWidget(QString objID, QSettings *settings, QWidget *parent = 0); //needs a unique ID (to distinguish from other DirWidgets)
    ~DirWidget();

    void cleanup(); //called before the browser is closed down

    //Directory Managment
    void ChangeDir(QString dirpath);
    void setDirCompleter(QCompleter *comp);

    //Information
    QString id();
    QString currentDir();
    QFileSystemModel *dirtreeModel;
    QStringList PREFAPPS;

    //View Settings
    void setShowDetails(bool show);
    void showHidden(bool show);
    void showThumbnails(bool show);
    void setThumbnailSize(int px);
    void setFocusLineDir();
    void adjustTreeWidget(float percent); //percent between 0-100
    void setTreeSortMode(int num); //0-4
    BrowserWidget* currentBrowser();

    static void createNewFolder(QWidget *parent, BrowserWidget *browser);


public slots:
    //void LoadDir(QString dir, LFileInfoList list);
    void LoadSnaps(QString basedir, QStringList snaps);

    //Refresh options
    void refresh(); //Refresh current directory

    //Theme change functions
    void UpdateIcons();
    void UpdateText();



private:
    Ui::DirWidget *ui;
    BrowserWidget *BW, *RCBW; //Main BrowserWidget and right-column browser widget
    QString ID, cBID; //unique ID assigned by the parent, and currently active browser widget
    QString normalbasedir, snapbasedir, snaprelpath, rootfmdir; //for maintaining directory context while moving between snapshots
    QStringList snapshots, needThumbs, tmpSel;
    QSettings *settings;
    bool canmodify;

    //The Toolbar and associated items
    QToolBar *toolbar;
    QLineEdit *line_dir;

    //The context menu and associated items
    QMenu *contextMenu, *cNewMenu, *cOpenMenu, *cFModMenu, *cFViewMenu, *cOpenWithMenu, *cArchiveMenu;

    //The keyboard shortcuts for context menu items
    QShortcut *kZoomIn, *kZoomOut, *kNewFile, *kNewDir, *kNewXDG, *kCut, *kCopy, *kPaste, *kRename, \
        *kFav, *kDel, *kOpSS, *kOpMM, *kOpTerm, *kExtract, *kArchive;

    //Functions for internal use
    void createShortcuts(); //on init only
    void createMenus(); //on init only

    QStringList currentDirFiles(); //all the "files" available within the current dir/browser

  //QProcess *pExtract;
  //OpenWithMenu
  QString fileEXT, filePath;
  QStringList mimetypes, keys, files;
  //QStringList getPreferredApplications();

private slots:
    //UI BUTTONS/Actions
    void splitterMoved();

    // -- Bottom Action Buttons
    void on_tool_zoom_in_clicked();
    void on_tool_zoom_out_clicked();

    // -- Top Snapshot Buttons
    void on_tool_snap_newer_clicked();
    void on_tool_snap_older_clicked();
    void on_slider_snap_valueChanged(int val = -1);
    void direct_snap_selected(QAction*);

    //Top Toolbar buttons
    void on_actionBack_triggered();
    void on_actionUp_triggered();
    void on_actionHome_triggered();
    void dir_changed(); //user manually changed the directory
    void on_actionSingleColumn_triggered(bool);
    void on_actionDualColumn_triggered(bool);
    void on_actionMenu_triggered();

    // - Other Actions without a specific button on the side
    void fileCheckSums();
    void fileProperties();
    void openTerminal();
    void openRootFM();


    //Browser Functions
    void OpenContextMenu();
    void UpdateContextMenu();
    void currentDirectoryChanged(QString dir, bool widgetonly = false);
    void currentDirectoryChanged(bool widgetonly = false);
    void dirStatusChanged(QString);
    void setCurrentBrowser(QString);
    void on_folderViewPane_clicked(const QModelIndex &index);

    //Context Menu Functions
    // - DIRECTORY operations
    void createNewFile();
    void createNewDir();
    void createNewXDGEntry();
    //void createNewSymlink();

    // - Selected FILE operations
    void cutFiles();
    void copyFiles();
    void pasteFiles();
    void renameFiles();
    void favoriteFiles();
    void removeFiles();
    void runFiles();
    void runWithFiles();
    //void attachToNewEmail();
    void autoExtractFiles();
    void autoArchiveFiles();
    void setAsWallpaper();

    // - Context-specific operations
    void openInSlideshow();
    void openMultimedia();
    void OpenWithApp(QAction*);

signals:
    //Directory loading/finding signals
    void OpenDirectories(QStringList); //Directories to open in other tabs/columns
    void findSnaps(QString, QString); //ID, dirpath (Request snapshot information for a directory)
    void CloseBrowser(QString); //ID (Request that this browser be closed)
    void treeWidgetSizeChanged(float); //percent width

    //External App/Widget launching
    void PlayFiles(LFileInfoList); //open in multimedia player
    void ViewFiles(LFileInfoList); //open in slideshow
    void LaunchTerminal(QString); //dirpath

    //System Interactions
    void CutFiles(QStringList); //file selection
    void CopyFiles(QStringList); //file selection
    void PasteFiles(QString, QStringList); //current dir
    void FavoriteFiles(QStringList); //file selection
    void RenameFiles(QStringList); //file selection
    void RemoveFiles(QStringList); //file selection
    void TabNameChanged(QString, QString); //objID, new tab name

protected:
    void mouseReleaseEvent(QMouseEvent *);

};

#endif
