package pages.components;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.pagefactory.AjaxElementLocatorFactory;
import pages.components.baseComponents.Header;
import pages.components.baseComponents.SMPPage;
import pages.components.baseComponents.PageComponent;
import utils.PROPERTIES;

import java.security.PublicKey;
import java.util.List;

public class Sidebar extends PageComponent {

	public Sidebar(WebDriver driver) {
		super(driver);
		PageFactory.initElements( new AjaxElementLocatorFactory(driver, PROPERTIES.TIMEOUT), this);
	}

	@SuppressWarnings("SpellCheckingInspection")
	@FindBy(tagName = "mat-sidenav")
	private WebElement sideBar;

	private WebElement topLogo;
	private WebElement topLogoText;

	@FindBy(id = "sidebar_search_id")
	private WebElement searchLnk;

	@FindBy(id = "sidebar_edit_id")
	private WebElement editLnk;

	@FindBy(id = "sidebar_domain_id")
	private WebElement domainLnk;

	@FindBy(id = "sidebar_user_id")
	private WebElement userLnk;

	/* Receives the Page object class as parameter and based on the class name it navigates to the appropriate page
	 and returns an instance of that class */
	public <T extends SMPPage> T goToPage(Class<T> expect){
		log.info("Navigating to " + expect.getSimpleName());

		switch (expect.getSimpleName()) {
			case "SearchPage":
				waitForElementToBeClickable(searchLnk).click();
				break;
			case "EditPage":
				waitForElementToBeClickable(editLnk).click();
				break;
			case "DomainPage":
				waitForElementToBeClickable(domainLnk).click();
				break;
			case "UsersPage":
				waitForElementToBeClickable(userLnk).click();
				break;
		}

		waitForXMillis(500);

		new Header(driver).waitForTitleToBe();

		waitForRowsToLoad();

		return PageFactory.initElements(driver, expect);
	}

	public boolean isSearchLnkEnabled(){
		return isVisible(searchLnk) && isEnabled(searchLnk);
	}
	public boolean isEditLnkEnabled(){
		return isVisible(editLnk) && isEnabled(editLnk);
	}
	public boolean isDomainLnkEnabled(){
		return isVisible(domainLnk) && isEnabled(domainLnk);
	}
	public boolean isUsersLnkEnabled(){
		return isVisible(userLnk) && isEnabled(userLnk);
	}

}