# -*- coding: utf-8 -*-
"""
novelWriter – Other Dialog Classes Tester
=========================================

This file is a part of novelWriter
Copyright 2018–2021, Veronica Berglyd Olsen

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/>.
"""

import os

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QDialog, QMessageBox, QAction

from tools import writeFile, readFile, getGuiItem
from dummy import causeOSError

from nw.gui.wordlist import GuiWordList
from nw.constants import nwFiles

keyDelay = 2
typeDelay = 1
stepDelay = 20

def testGuiWordList_Dialog(qtbot, monkeypatch, nwGUI, nwMinimal, tmpDir):
    """test the word list editor.
    """
    monkeypatch.setattr(QMessageBox, "question", lambda *args: QMessageBox.Yes)
    monkeypatch.setattr(QMessageBox, "critical", lambda *args: QMessageBox.Yes)
    monkeypatch.setattr(GuiWordList, "exec_", lambda *args: None)
    monkeypatch.setattr(GuiWordList, "result", lambda *args: QDialog.Accepted)
    monkeypatch.setattr(GuiWordList, "accept", lambda *args: None)

    # Open project
    nwGUI.openProject(nwMinimal)
    qtbot.wait(stepDelay)
    dictFile = os.path.join(nwMinimal, "meta", nwFiles.PROJ_DICT)

    # Load the dialog
    nwGUI.mainMenu.aEditWordList.activate(QAction.Trigger)
    qtbot.waitUntil(lambda: getGuiItem("GuiWordList") is not None, timeout=1000)

    wList = getGuiItem("GuiWordList")
    assert isinstance(wList, GuiWordList)
    wList.show()
    qtbot.wait(stepDelay)

    # List should be blank
    assert wList.listBox.count() == 0

    # Add words
    writeFile(dictFile, (
        "word_a\n"
        "word_c\n"
        "word_g\n"
        "      \n" # Should be ignored
        "word_f\n"
        "word_b\n"
    ))
    qtbot.wait(stepDelay)
    assert wList._loadWordList()

    # Check that the content was loaded
    assert wList.listBox.item(0).text() == "word_a"
    assert wList.listBox.item(1).text() == "word_b"
    assert wList.listBox.item(2).text() == "word_c"
    assert wList.listBox.item(3).text() == "word_f"
    assert wList.listBox.item(4).text() == "word_g"

    # Add a blank word
    wList.newEntry.setText("   ")
    assert not wList._doAdd()

    # Add an existing word
    wList.newEntry.setText("word_c")
    assert not wList._doAdd()

    # Add a new word
    wList.newEntry.setText("word_d")
    assert wList._doAdd()

    # Check that the content now
    assert wList.listBox.item(0).text() == "word_a"
    assert wList.listBox.item(1).text() == "word_b"
    assert wList.listBox.item(2).text() == "word_c"
    assert wList.listBox.item(3).text() == "word_d"
    assert wList.listBox.item(4).text() == "word_f"
    assert wList.listBox.item(5).text() == "word_g"

    # Delete a word
    wList.newEntry.setText("delete_me")
    assert wList._doAdd()
    assert wList.listBox.item(0).text() == "delete_me"

    delItem = wList.listBox.findItems("delete_me", Qt.MatchExactly)[0]
    assert delItem.text() == "delete_me"
    delItem.setSelected(True)
    wList._doDelete()
    assert wList.listBox.findItems("delete_me", Qt.MatchExactly) == []
    assert wList.listBox.item(0).text() == "word_a"

    # Save files
    assert wList._doSave()
    assert readFile(dictFile) == (
        "word_a\n"
        "word_b\n"
        "word_c\n"
        "word_d\n"
        "word_f\n"
        "word_g\n"
    )

    # Save again and make it fail
    monkeypatch.setattr("builtins.open", causeOSError)
    assert not wList._doSave()

    # qtbot.stopForInteraction()
    wList._doClose()

# END Test testGuiWordList_Dialog
