#
# pgAdmin 4 - PostgreSQL Tools
#
# Copyright (C) 2013 - 2026, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################


class TreeAreaLocators:
    """This will contains element locators for tree area, will also contain
    parametrized xpath where applicable"""

    # Server Group Node
    @staticmethod
    def server_group_node(server_group_name):
        return "//span[starts-with(text(),'%s')]" % server_group_name

    @staticmethod
    def server_group_node_exp_status(server_group_name):
        return "//i[@class='directory-toggle open']/following-sibling::" \
               "span//span[starts-with(text(),'%s')]" % server_group_name

    # Server Node
    @staticmethod
    def server_node(server_name):
        return "//div[@id='id-object-explorer']" \
               "//span[starts-with(text(),'%s')]" \
               % server_name

    @staticmethod
    def server_node_exp_status(server_name):
        return "//i[@class='directory-toggle open']/following-sibling::" \
               "span//span[starts-with(text(),'%s')]" % server_name

    # Server Connection
    @staticmethod
    def server_connection_status_element(server_name):
        return "//div[@id='id-object-explorer']" \
               "//span[starts-with(text(),'%s')]/" \
               "preceding-sibling::i" % server_name

    # Databases Node
    @staticmethod
    def databases_node(server_name):
        return "//div[div[div[span[span[starts-with(text(),'%s')]]]]]/" \
               "following-sibling::div//span[text()='Databases']" % server_name

    @staticmethod
    def databases_node_exp_status(server_name):
        return "//div[div[div[span[span[starts-with(text(),'%s')]]]]]/" \
               "following-sibling::div//span[span[text()='Databases']]/" \
               "preceding-sibling::i[@class='directory-toggle open']" \
               % server_name

    # Database Node
    @staticmethod
    def database_node(database_name):
        return "//div[@data-depth='4']/span/span[text()='%s']" % database_name

    @staticmethod
    def database_node_exp_status(database_name):
        return "//i[@class='directory-toggle open']/following-sibling::" \
               "span//span[text()='%s']" % database_name

    # Schemas Node
    @staticmethod
    def schemas_node(database_name):
        return "//div[div[div[span[span[starts-with(text(),'%s')]]]]]/" \
               "following-sibling::div//span[text()='Schemas']" % database_name

    @staticmethod
    def schemas_node_exp_status(database_name):
        return "//div[div[div[span[span[starts-with(text(),'%s')]]]]]/" \
               "following-sibling::span//div[span[span[text()='Schemas']]]/" \
               "preceding-sibling::i[@class='directory-toggle open']" \
               % database_name

    # Schema Node
    @staticmethod
    def schema_node(schema_name):
        return "//div[@id='id-object-explorer']" \
               "//span[text()='%s']" % schema_name

    @staticmethod
    def schema_node_exp_status(schema_name):
        return "//i[@class='directory-toggle open']/" \
               "following-sibling::span//span[text()='%s']" % schema_name

    # Tables Node
    @staticmethod
    def tables_node(schema_name):
        return ("//div[div[div[span/span[text()='%s']]]]/"
                "following-sibling::div//span[text()='Tables']" % schema_name)

    @staticmethod
    def tables_node_exp_status(schema_name):
        return "//div[div[span[span[starts-with(text(),'%s')]]]]/" \
               "following-sibling::span//div[span[span[text()='Tables']]]/" \
               "preceding-sibling::i[@class='directory-toggle open']"\
               % schema_name

    # Schema child
    child_node_exp_status = \
        "//div[div[div[span[span[starts-with(text(),'%s')]]]]]/" \
        "following-sibling::div//span[span[text()='%s']]/" \
        "preceding-sibling::i[@class='directory-toggle open']"

    child_node = "//div[div[div[span[span[starts-with(text(),'%s')]]]]]/" \
                 "following-sibling::div//span[text()='%s']"

    @staticmethod
    def schema_child_node_exp_status(schema_name, child_node_name):
        return TreeAreaLocators.child_node_exp_status \
            % (schema_name, child_node_name)

    @staticmethod
    def schema_child_node(schema_name, child_node_name):
        return TreeAreaLocators.child_node % (schema_name, child_node_name)

    @staticmethod
    def schema_child_node_expand_icon_xpath(schema_name, child_node_name):
        return "//div[div[div[span[span[starts-with(text(),'%s')]]]]]/" \
               "following-sibling::div//div[span[text()='%s']]/../" \
               "preceding-sibling::i" % (schema_name, child_node_name)

    # Database child
    @staticmethod
    def database_child_node_exp_status(database_name, child_node_name):
        return TreeAreaLocators.child_node_exp_status \
            % (database_name, child_node_name)

    @staticmethod
    def database_child_node(database_name, child_node_name):
        return TreeAreaLocators.child_node % (database_name, child_node_name)

    # Server child
    @staticmethod
    def server_child_node_exp_status(server_name, child_node_name):
        return TreeAreaLocators.child_node_exp_status \
            % (server_name, child_node_name)

    @staticmethod
    def server_child_node(server_name, child_node_name):
        return TreeAreaLocators.child_node % (server_name, child_node_name)

    # Table Node
    @staticmethod
    def table_node(table_name):
        return "//div[@data-depth='8']/span/span[text()='%s']" % table_name

    # Function Node
    @staticmethod
    def function_node(table_name):
        return "//div[@data-depth='8']/span/span[text()='%s']" % table_name

    # Role Node
    @staticmethod
    def role_node(role_name):
        return "//div[@data-depth='4']/span/span[text()='%s']" % role_name

    # Context element option
    @staticmethod
    def context_menu_element(schema_name):
        return "[role='menuitem'][data-label='%s']" % schema_name
