// SPDX-License-Identifier: BSD-3-Clause
// Copyright (c) 2020-2021, The Monero Project.

#include "utils/utils.h"
#include "wizard/walletwizard.h"
#include "wizard/menu.h"
#include "wizard/openwallet.h"
#include "wizard/createwallet.h"
#include "wizard/network.h"
#include "wizard/createwalletseed.h"
#include "wizard/restorewallet.h"
#include "wizard/viewonlywallet.h"

#include <QLineEdit>
#include <QVBoxLayout>
#include <QScreen>

WalletWizard::WalletWizard(AppContext *ctx, WalletWizard::Page startPage, QWidget *parent)
        : QWizard(parent)
        , m_ctx(ctx)
{
    this->setWindowTitle("Welcome to WOWlet");
    this->setWindowIcon(QIcon(":/assets/images/appicons/64x64.png"));

    m_walletKeysFilesModel = new WalletKeysFilesModel(m_ctx, this);
    m_walletKeysFilesModel->refresh();

    auto openWalletPage = new OpenWalletPage(m_ctx, m_walletKeysFilesModel, this);
    auto createWallet = new CreateWalletPage(m_ctx, this);
    auto createWalletSeed = new CreateWalletSeedPage(m_ctx, this);
    setPage(Page_Menu, new MenuPage(m_ctx, m_walletKeysFilesModel, this));
    setPage(Page_CreateWallet, createWallet);
    setPage(Page_OpenWallet, openWalletPage);
    setPage(Page_CreateWalletSeed, createWalletSeed);
    setPage(Page_Network, new NetworkPage(m_ctx, this));
    setPage(Page_Restore, new RestorePage(m_ctx, this));
    setPage(Page_ViewOnly, new ViewOnlyPage(m_ctx, this));

    if(config()->get(Config::firstRun).toUInt())
        setStartId(Page_Network);
    else
        setStartId(Page_Menu);

    setButtonText(QWizard::CancelButton, "Close");
    QStringList headers = {
            ":/assets/images/welcome/wow1.png",
            ":/assets/images/welcome/wow2.png",
            ":/assets/images/welcome/wow3.png",
            ":/assets/images/welcome/wow4.png",
            ":/assets/images/welcome/wow5.png",
            ":/assets/images/welcome/wow6.png",
            ":/assets/images/welcome/wow7.png",
            ":/assets/images/welcome/wow8.png",
            ":/assets/images/welcome/wow9.png",
            ":/assets/images/welcome/wow10.png",
            ":/assets/images/welcome/wow11.png",
            ":/assets/images/welcome/wow12.png",
            ":/assets/images/welcome/wow13.png",
            ":/assets/images/welcome/wow14.png",
            ":/assets/images/welcome/wow15.png",
            ":/assets/images/welcome/wow16.png",
            ":/assets/images/welcome/wow17.png",
            ":/assets/images/welcome/wow18.png",
            ":/assets/images/welcome/wow19.png",
            ":/assets/images/welcome/wow20.png",
            ":/assets/images/welcome/wow21.png",
            ":/assets/images/welcome/wow22.png",
            ":/assets/images/welcome/wow23.png",
            ":/assets/images/welcome/wow24.png",
            ":/assets/images/welcome/wow25.png",
            ":/assets/images/welcome/wow26.png",
            ":/assets/images/welcome/wow27.png",
            ":/assets/images/welcome/wow28.png",
            ":/assets/images/welcome/wow29.png",
            ":/assets/images/welcome/wow30.png",
            ":/assets/images/welcome/wow31.png",
            ":/assets/images/welcome/wow32.png",
            ":/assets/images/welcome/wow33.png",
            ":/assets/images/welcome/wow34.png",
            ":/assets/images/welcome/wow35.png",
            ":/assets/images/welcome/wow36.png",
            ":/assets/images/welcome/wow37.png",
            ":/assets/images/welcome/wow38.png",
            ":/assets/images/welcome/wow39.png",
            ":/assets/images/welcome/wow40.png",
            ":/assets/images/welcome/wow41.png",
            ":/assets/images/welcome/wow42.png",
            ":/assets/images/welcome/wow43.png",
            ":/assets/images/welcome/wow44.png",
            ":/assets/images/welcome/wow45.png",
            ":/assets/images/welcome/wow46.png",
            ":/assets/images/welcome/wow47.png",
            ":/assets/images/welcome/wow48.png",
            ":/assets/images/welcome/wow49.png",
            ":/assets/images/welcome/wow50.png",
            ":/assets/images/welcome/wow51.png",
            ":/assets/images/welcome/wow52.png",
            ":/assets/images/welcome/wow53.png",
            ":/assets/images/welcome/wow54.png",
            ":/assets/images/welcome/wow55.png",
            ":/assets/images/welcome/wow56.png",
            ":/assets/images/welcome/wow57.png",
            ":/assets/images/welcome/wow58.png",
            ":/assets/images/welcome/wow59.png",
            ":/assets/images/welcome/wow60.png",
            ":/assets/images/welcome/wow61.png",
            ":/assets/images/welcome/wow62.png",
            ":/assets/images/welcome/wow63.png",
            ":/assets/images/welcome/wow64.png",
            ":/assets/images/welcome/wow65.png",
            ":/assets/images/welcome/wow66.png",
            ":/assets/images/welcome/wow67.png",
            ":/assets/images/welcome/wow68.png",
            ":/assets/images/welcome/wow69.png",
            ":/assets/images/welcome/wow70.png",
            ":/assets/images/welcome/wow71.png",
            ":/assets/images/welcome/wow72.png",
            ":/assets/images/welcome/wow73.png",
            ":/assets/images/welcome/wow74.png",
            ":/assets/images/welcome/wow75.png",
            ":/assets/images/welcome/wow76.png"
    };
    int random = QRandomGenerator::global()->bounded(headers.count());
    auto header = headers.at(random);
    setPixmap(QWizard::WatermarkPixmap, QPixmap(header));

    setWizardStyle(WizardStyle::ModernStyle);
    setOption(QWizard::NoBackButtonOnStartPage);

    connect(this, &QWizard::rejected, [=]{
        return QApplication::exit(1);
    });

    connect(createWalletSeed, &CreateWalletSeedPage::createWallet, this, &WalletWizard::createWallet);
    connect(createWallet, &CreateWalletPage::createWallet, this, &WalletWizard::createWallet);
    connect(createWallet, &CreateWalletPage::defaultWalletDirChanged, [this](const QString &walletDir){
        emit defaultWalletDirChanged(walletDir);
    });

    connect(openWalletPage, &OpenWalletPage::openWallet, [=](const QString &path){
        const auto walletPasswd = this->field("walletPasswd").toString();
        emit openWallet(path, walletPasswd);
    });
}

void WalletWizard::createWallet() {
    auto mnemonicRestoredSeed = this->field("mnemonicRestoredSeed").toString();
    auto mnemonicSeed = mnemonicRestoredSeed.isEmpty() ? this->field("mnemonicSeed").toString() : mnemonicRestoredSeed;
    const auto walletPath = this->field("walletPath").toString();
    const auto walletPasswd = this->field("walletPasswd").toString();
    auto restoreHeight = this->field("restoreHeight").toUInt();
    auto viewKey = this->field("viewOnlyViewKey").toString();
    auto spendKey = this->field("viewOnlySpendKey").toString();
    auto viewAddress = this->field("viewOnlyAddress").toString();

    if(!viewKey.isEmpty() && !viewAddress.isEmpty()) {
        auto viewHeight = this->field("viewOnlyHeight").toUInt();
        m_ctx->createWalletViewOnly(walletPath,
                                    walletPasswd,
                                    viewAddress,
                                    viewKey, spendKey, viewHeight);
        return;
    }

    auto seed = WowletSeed(m_ctx->restoreHeights[m_ctx->networkType], m_ctx->coinName, m_ctx->seedLanguage, mnemonicSeed.split(" "));

    if(restoreHeight > 0)
        seed.setRestoreHeight(restoreHeight);
    m_ctx->createWallet(seed, walletPath, walletPasswd);
}
