# This work is licensed under the GNU GPLv2 or later.
# See the COPYING file in the top-level directory.

from . import lib


#################################################
# UI tests for virt-manager's VM details window #
#################################################


def testHostNetworkSmokeTest(app):
    """
    Verify that each virtual network displays, without error.
    """
    win = app.manager_open_host("Virtual Networks")
    lst = win.find("net-list", "table")
    errlabel = win.find("net-error-label", "label")
    lib.utils.walkUIList(app, win, lst, lambda: errlabel.showing)

    # Select XML editor, and reverse walk the list
    win.find("network-grid").find("XML", "page tab").click()
    lib.utils.walkUIList(app, win, lst, lambda: errlabel.showing, reverse=True)


def testHostNetworkEdit(app):
    """
    Test edits to net config
    """
    app.open(xmleditor_enabled=True)
    win = app.manager_open_host("Virtual Networks").find("network-grid")
    finish = win.find("Apply", "push button")

    # Shut it off, do an XML edit, verify it
    win.find("default", "table cell").click()
    delete = win.find("net-delete", "push button")
    stop = win.find("net-stop", "push button")
    stop.click()
    lib.utils.check(lambda: delete.sensitive)
    win.find("XML", "page tab").click()
    xmleditor = win.find("XML editor")
    origdev = "virbr0"
    newdev = "virbr77"
    xmleditor.set_text(xmleditor.text.replace(origdev, newdev))
    finish.click()
    win.find("Details", "page tab").click()
    netdev = win.find("net-device")
    lib.utils.check(lambda: netdev.text == newdev)

    # Rename it
    win.find("default", "table cell").click()
    win.find("net-name").set_text("newsort-default")
    finish.click()

    # Change autostart, trigger it by clicking away
    win.find("newsort-default", "table cell").click()
    win.find("net-autostart").click()
    win.find("netboot", "table cell").click()
    app.click_alert_button("There are unapplied changes", "Yes")

    # Do standard xmleditor tests
    lib.utils.test_xmleditor_interactions(app, win, finish)


def testHostStorageSmokeTest(app):
    """
    Verify that each storage pool displays, without error.
    """
    win = app.manager_open_host("Storage")
    lst = win.find("pool-list", "table")
    errlabel = win.find("pool-error-label", "label")
    lib.utils.walkUIList(app, win, lst, lambda: errlabel.showing)

    # Select XML editor, and reverse walk the list
    win.find("storage-grid").find("XML", "page tab").click()
    lib.utils.walkUIList(app, win, lst, lambda: errlabel.showing, reverse=True)


def testHostStorageEdit(app):
    """
    Test edits to pool config
    """
    app.open(xmleditor_enabled=True)
    win = app.manager_open_host("Storage").find("storage-grid")
    finish = win.find("Apply", "push button")

    # Shut off a pool, do an XML edit, verify it
    win.find("pool-dir", "table cell").click()
    delete = win.find("pool-delete", "push button")
    stop = win.find("pool-stop", "push button")
    stop.click()
    lib.utils.check(lambda: delete.sensitive)
    win.find("XML", "page tab").click()
    xmleditor = win.find("XML editor")
    origpath = "/pool-dir"
    newpath = "/dev/foo/bar/baz"
    xmleditor.set_text(xmleditor.text.replace(origpath, newpath))
    finish.click()
    win.find("Details", "page tab").click()
    poolloc = win.find("pool-location")
    lib.utils.check(lambda: poolloc.text == newpath)

    # Rename it
    win.find("pool-dir", "table cell").click()
    win.find("pool-name").set_text("newsort-default")
    finish.click()

    # Change autostart. Trigger it by clicking on new cell
    win.find("newsort-default", "table cell").click()
    win.find("pool-autostart").click()
    win.find("pool-logical", "table cell").click()
    app.click_alert_button("There are unapplied changes", "Yes")

    # Do standard xmleditor tests
    lib.utils.test_xmleditor_interactions(app, win, finish)


def testHostStorageVolMisc(app):
    """
    Misc actions involving volumes
    """
    win = app.manager_open_host("Storage").find("storage-grid")
    win.find_fuzzy("pool-dir", "table cell").click()
    vollist = win.find("vol-list", "table")

    vol1 = vollist.find("backingl1.img", "table cell")
    vol2 = vollist.find("UPPER", "table cell")
    vol1.check_onscreen()
    vol2.check_not_onscreen()
    win.find("Size", "table column header").click()
    win.find("Size", "table column header").click()
    vol1.check_not_onscreen()
    vol2.check_onscreen()

    vol2.click(button=3)
    app.root.find("Copy Volume Path", "menu item").click()
    from gi.repository import Gdk, Gtk

    clipboard = Gtk.Clipboard.get_default(Gdk.Display.get_default())
    lib.utils.check(lambda: clipboard.wait_for_text() == "/pool-dir/UPPER")


def testHostConn(app):
    """
    Change some connection parameters
    """
    manager = app.topwin
    # Disconnect the connection
    app.manager_conn_disconnect("test testdriver.xml")

    # Open Host Details from right click menu
    c = manager.find("test testdriver.xml", "table cell")
    c.click(button=3)
    app.root.find("conn-details", "menu item").click()
    win = app.find_window("test testdriver.xml - Connection Details")

    # Click the tabs and then back
    win.find_fuzzy("Storage", "tab").click()
    win.find_fuzzy("Network", "tab").click()
    win.find_fuzzy("Overview", "tab").click()

    # Toggle autoconnect
    win.find("Autoconnect:", "check box").click()
    win.find("Autoconnect:", "check box").click()

    # Change the name, verify that title bar changed
    win.find("Name:", "text").set_text("FOOBAR")
    app.find_window("FOOBAR - Connection Details")

    # Open the manager window
    win.find("File", "menu").click()
    win.find("View Manager", "menu item").click()
    lib.utils.check(lambda: manager.active)
    # Confirm connection row is named differently in manager
    manager.find("FOOBAR", "table cell")

    # Close the manager
    manager.window_close()
    lib.utils.check(lambda: win.active)

    # Quit app from the file menu
    win.find("File", "menu").click()
    win.find("Quit", "menu item").click()
    lib.utils.check(lambda: not app.is_running())
