#include <QtWidgets>
#include "Utilities.h"
#include "MdiChild.h"
#include "ui_ExtensibleObjectModelUI.h"


MdiChild::MdiChild()
{
    setAttribute(Qt::WA_DeleteOnClose);
    isUntitled = true;
    connect(document(), SIGNAL(contentsChanged()), this, SIGNAL(documentContentsChanged()));
}

MdiChild::~MdiChild()
{
    closing();
}

void MdiChild::newFile()
{
    static int sequenceNumber = 1;
    isUntitled = true;
    curFile = tr("document%1.txt").arg(sequenceNumber++);
    setWindowTitle(curFile + "[*]");
    connect(document(), SIGNAL(contentsChanged()), this, SLOT(documentWasModified()));
}

bool MdiChild::loadFile(const QString &fileName)
{
    QFile file(fileName);
    if (!file.open(QFile::ReadOnly | QFile::Text)) {
        QMessageBox::warning(this, tr("MDI"),
                 tr("Cannot read file %1:\n%2.").arg(fileName).arg(file.errorString()));
        return false;
    }
    QTextStream in(&file);
    QApplication::setOverrideCursor(Qt::WaitCursor);
    setPlainText(in.readAll());
    QApplication::restoreOverrideCursor();

    setCurrentFile(fileName);
    connect(document(), SIGNAL(contentsChanged()), this, SLOT(documentWasModified()));
    return true;
}

bool MdiChild::save()
{
    return (isUntitled) ? saveAs() : saveFile(curFile);
}

bool MdiChild::saveAs()
{
    QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), curFile);
    if (fileName.isEmpty())
        return false;
    return saveFile(fileName);
}

bool MdiChild::saveFile(const QString &fileName)
{
    QFile file(fileName);
    if (!file.open(QFile::WriteOnly | QFile::Text)) {
        QMessageBox::warning(this, tr("MDI"),
              tr("Cannot write file %1:\n%2.").arg(fileName).arg(file.errorString()));
        return false;
    }
    QTextStream out(&file);
    QApplication::setOverrideCursor(Qt::WaitCursor);
    out << toPlainText();
    QApplication::restoreOverrideCursor();

    setCurrentFile(fileName);
    return true;
}

QString MdiChild::userFriendlyCurrentFile()
{
    return strippedName(curFile);
}

void MdiChild::closeEvent(QCloseEvent *event)
{
    if (maybeSave()) {
        event->accept();
    } else {
        event->ignore();
    }
}

void MdiChild::documentWasModified()
{
    setWindowModified(document()->isModified());
}

bool MdiChild::maybeSave()
{
    if (document()->isModified()) {
        QMessageBox::StandardButton ret;
        ret = QMessageBox::warning(this, tr("MDI"),
                     tr("'%1' has been modified.\n"
                        "Do you want to save your changes?")
                     .arg(userFriendlyCurrentFile()),
                     QMessageBox::Save | QMessageBox::Discard
                     | QMessageBox::Cancel);
        if (ret == QMessageBox::Save)
            return save();
        else if (ret == QMessageBox::Cancel)
            return false;
    }
    return true;
}

void MdiChild::setCurrentFile(const QString &fileName)
{
    curFile = QFileInfo(fileName).canonicalFilePath();
    isUntitled = false;
    document()->setModified(false);
    setWindowModified(false);
    setWindowTitle(userFriendlyCurrentFile() + "[*]");
}

QString MdiChild::strippedName(const QString &fullFileName)
{
    return QFileInfo(fullFileName).fileName();
}



void MdiChild::markdownSelection(const char* preText, const char* postText)
{
    QTextCursor cur = textCursor();
    cur.beginEditBlock();
    QString selectedText = cur.selection().toPlainText();
    cur.removeSelectedText();
    cur.insertText(preText + selectedText + postText);
    cur.endEditBlock();
}



void MdiChild::bold()
{
    markdownSelection("**", "**");
}

void MdiChild::italic()
{
    markdownSelection("*", "*");
}

void MdiChild::quote()
{
    markdownSelection("`", "`");
}

void MdiChild::code()
{
    //markdownSelection("*", "*");
    // Need to add indentation of text with 4 spaces each line
}

void MdiChild::heading1()
{
    markdownSelection("# ", " #");
}

void MdiChild::heading2()
{
    markdownSelection("## ", " ##");
}

void MdiChild::heading3()
{
    markdownSelection("### ", " ###");
}

void MdiChild::heading4()
{
    markdownSelection("#### ", " ####");
}

void MdiChild::hyperlink()
{
}

void MdiChild::image()
{
}

void MdiChild::unorderedList()
{
}

void MdiChild::orderedList()
{
}

void MdiChild::horizontalRule()
{
}

void MdiChild::timestamp()
{
}

void MdiChild::pageNumber()
{
}

void MdiChild::pageCount()
{
}

void MdiChild::del()
{
    //QTextEdit::cursor().pos()
}

void MdiChild::undo()
{
}

void MdiChild::redo()
{
}

void MdiChild::find()
{
}

void MdiChild::findNext()
{
}

void MdiChild::findPrevious()
{
}

void MdiChild::goToLine()
{
}

