/***************************************************************************
 * Copyright (C) 2018 by Savoir-faire Linux                                *
 * Author: Isa Nanic <isa.nanic@savoirfairelinux.com>                      *
 *                                                                         *
 * This program is free software; you can redistribute it and/or modify    *
 * it under the terms of the GNU General Public License as published by    *
 * the Free Software Foundation; either version 3 of the License, or       *
 * (at your option) any later version.                                     *
 *                                                                         *
 * This program is distributed in the hope that it will be useful,         *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
 * GNU General Public License for more details.                            *
 *                                                                         *
 * You should have received a copy of the GNU General Public License       *
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.   *
 **************************************************************************/

#pragma once
#include <QScrollArea>
#include <QSettings>
#include <QMovie>

#include "navwidget.h"
#include "lrcinstance.h"

#include "advancedsettingswidget.h"
#include "bannedlistmodel.h"

#include "linkdevwidget.h"
#include "ui_linkdevwidget.h"

 // general settings
#include "api/datatransfermodel.h"
#include "typedefs.h"

// av settings
#include "video/devicemodel.h"


namespace Ui {
    class SettingsWidget;
}

class SettingsWidget : public NavWidget
{
    Q_OBJECT
    SettingsWidget(const SettingsWidget& cpy);

public:
    explicit SettingsWidget(QWidget* parent = nullptr);
    ~SettingsWidget();
    void resize(int size);

public slots:
    void updateSettings(int size);

private:
    enum Button {accountSettingsButton, generalSettingsButton, avSettingsButton};
    enum RegName {BLANK, INVALIDFORM, TAKEN, FREE, SEARCHING};
    enum List {DevList, BannedContacts};

    void setSelected(Button sel);
    void updateAccountInfoDisplayed();

    void resizeEvent(QResizeEvent* event);
    bool avSettingsHaveAppeared = false;

    Ui::SettingsWidget* ui;

    // *************************  Account Settings  *************************
    void passwordClicked();
    void avatarClicked();

    void afterNameLookup(lrc::api::account::LookupStatus status, const std::string& regName);
    QString registeredName_;

    bool validateRegNameForm(const QString& regName);

    AdvancedSettingsWidget* advancedSettingsWidget_;
    QScrollArea* scrollArea_;
    Button pastButton_ = Button::generalSettingsButton;
    bool advancedSettingsDropped_ = false;
    bool bannedContactsShown_ = false;

    int avatarSize_;

    void setRegNameUi(RegName stat);
    bool regNameBtn_ = false;

    const int itemHeight_ = 55;

    void removeDeviceSlot(int index);
    void unban(int index);

    void setConnections();
    QMovie* gif;

    LinkDevWidget* linkDevWidget;


private slots:
    void leaveSettingsSlot();
    void verifyRegisteredNameSlot();
    void beforeNameLookup();
    void receiveRegNameSlot(const std::string& accountID, lrc::api::account::LookupStatus status,
        const std::string& address, const std::string& name);
    void regNameRegisteredSlot();
    void setAccEnableSlot(int state);
    void delAccountSlot();

    void toggleAdvancedSettings();
    void toggleBannedContacts();
    void exportAccountSlot();

    void updateAndShowDevicesSlot();
    void updateAndShowBannedContactsSlot();

    void showLinkDevSlot();
    void showCurrentAccountSlot();

    void setButtonIconSlot(int frame);



    // *************************  General Settings  *************************
private:
    void populateGeneralSettings();

    QSettings* settings_;

private slots:
    void setNotificationsSlot(int state);
    void checkForUpdateSlot();
    void setClosedOrMinSlot(int state);
    void openDownloadFolderSlot();
    void setAlwaysRecordingSlot(int state);
    void openRecordFolderSlot();
    void setUpdateIntervalSlot(int value);
    void setUpdateAutomaticSlot(int state);

    // *************************  Audio/Visual Settings  *************************
private:
    void populateAVSettings();
    Video::DeviceModel* deviceModel_;
    void showPreview();
    bool isLoading_;

private slots:
    void deviceIndexChanged(int index);
    void deviceBoxCurrentIndexChangedSlot(int index);
    void sizeBoxCurrentIndexChangedSlot(int index);
    void outputDevIndexChangedSlot(int index);
    void inputdevIndexChangedSlot(int index);

};
