package com.framework.site.objects.header;
import com.framework.asserts.JAssertion;
import com.framework.driver.event.HtmlElement;
import com.framework.driver.event.HtmlObject;
import com.framework.driver.exceptions.UrlNotAvailableException;
import com.framework.driver.objects.Link;
import com.framework.site.data.Destinations;
import com.framework.site.objects.header.interfaces.Header;
import com.framework.site.pages.core.cruiseto.CruiseToDestinationPage;
import com.framework.utils.matchers.JMatchers;
import com.google.common.base.Optional;
import org.apache.commons.lang3.StringUtils;
import org.openqa.selenium.By;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import static com.framework.utils.datetime.TimeConstants.FIVE_SECONDS;
import static com.framework.utils.datetime.TimeConstants.TWO_SECONDS;
import static org.hamcrest.Matchers.*;
class TopDestinationsObject extends HeaderBrandingObject implements Header.HeaderBranding.TopDestinations
{
//region TopDestinationsObject - Variables Declaration and Initialization Section.
private static final Logger logger = LoggerFactory.getLogger( TopDestinationsObject.class );
private HtmlElement nav_tooltip_trigger, nav_tooltip_top_destinations, nav_tooltip_trigger_parent;
private HtmlElement li_title;
private List<HtmlElement> top_destinations;
//endregion
//region TopDestinationsObject - Constructor Methods Section
TopDestinationsObject( final HtmlElement rootElement )
{
super( rootElement, TopDestinations.LOGICAL_NAME );
initWebObject();
}
//endregion
//region TopDestinationsObject - Initialization and Validation Methods Section
@Override
protected void initWebObject()
{
logger.debug( "validating static elements for web object id: <{}>, name:<{}>...",
getQualifier(), getLogicalName() );
final String REASON = "assert that element \"%s\" exits";
JAssertion assertion = getRoot().createAssertion();
Optional<HtmlElement> e = getRoot().childExists( By.cssSelector( ".nav-tooltip li.title" ), FIVE_SECONDS );
assertion.assertThat( String.format( REASON, ".nav-tooltip li.title" ), e.isPresent(), JMatchers.is( true ) );
}
//endregion
//region TopDestinationsObject - Service Methods Section
private HtmlElement getRoot()
{
return getBaseRootElement( Header.HeaderBranding.ROOT_BY );
}
//endregion
//region TopDestinationsObject - Business Methods Section
@Override
public boolean isDisplayed()
{
return getRoot().isDisplayed();
}
@Override
public List<String> openTopDestinationsList()
{
logger.debug( "opening the country list, by clicking on top-destinations trigger ..." );
findNavTooltipTriggerAnchor().click();
getRoot().waitAttributeToMatch( "class", endsWith( "increaseZ" ), TWO_SECONDS );
findNavTooltipTriggerParent().waitAttributeToMatch( "class", is( "hover" ), TWO_SECONDS );
findNavTooltipDiv().waitToBeDisplayed( true, TWO_SECONDS );
return HtmlObject.extractText( findTopDestinations() );
}
@Override
public void closeTopDestinationsList()
{
logger.debug( "closing the country list, by clicking on top-destinations trigger ..." );
findNavTooltipTriggerAnchor().click();
getRoot().waitAttributeToMatch( "class", not( endsWith( "increaseZ" ) ), TWO_SECONDS );
findNavTooltipTriggerParent().waitAttributeToMatch( "class", isEmptyOrNullString(), TWO_SECONDS );
findNavTooltipDiv().waitToBeDisplayed( false, TWO_SECONDS );
}
@Override
public CruiseToDestinationPage clickLink( final Destinations destination ) throws UrlNotAvailableException
{
logger.info( "Clicking and testing href for link {} Cruises", destination.toString() );
Link destinationLink = new Link( findTopDestination( destination ) );
destinationLink.checkReference( 5000 );
destinationLink.click();
logger.info( "Waiting for page CruiseToDestinationPage to be loaded ..." );
CruiseToDestinationPage.forDestination( destination );
CruiseToDestinationPage c2d = new CruiseToDestinationPage();
logger.info( "returning a new page instance -> '{}'", c2d );
return c2d;
}
@Override
public String getListTitle()
{
return findTitleLi().getText().equals( StringUtils.EMPTY )
? findTitleLi().getText()
: findTitleLi().getAttribute( "textContent" );
}
@Override
public boolean isTopDestinationsListOpened()
{
return findNavTooltipDiv().isDisplayed();
}
//endregion
//region TopDestinationsObject - Element Finder Methods Section
private HtmlElement findNavTooltipTriggerAnchor()
{
final By findBy = By.cssSelector( "a[data-id='top-destinations']" );
if( null == nav_tooltip_trigger )
{
nav_tooltip_trigger = super.findZeroNavUl().findElement( findBy );
}
return nav_tooltip_trigger;
}
private HtmlElement findNavTooltipTriggerParent()
{
// if( null == nav_tooltip_trigger_parent )
// {
// nav_tooltip_trigger_parent = findNavTooltipTriggerAnchor().parent();
// }
// return nav_tooltip_trigger_parent;
return null;
}
private HtmlElement findNavTooltipDiv()
{
final By findBy = By.cssSelector( "div[data-id='top-destinations']" );
if( null == nav_tooltip_top_destinations )
{
nav_tooltip_top_destinations = super.findZeroNavUl().findElement( findBy );
}
return nav_tooltip_top_destinations;
}
private HtmlElement findTitleLi()
{
final By findBy = By.className( "title" );
if( null == li_title )
{
li_title = findNavTooltipDiv().findElement( findBy );
}
return li_title;
}
private List<HtmlElement> findTopDestinations()
{
final By findBy = By.tagName( "a" );
if( null == top_destinations )
{
top_destinations = findNavTooltipDiv().findElements( findBy );
}
return top_destinations;
}
private HtmlElement findTopDestination( Destinations destinations )
{
final By findBy = By.cssSelector( String.format( "a[href $='%s-cruises.aspx']", destinations.name().toLowerCase() ) );
return findNavTooltipDiv().findElement( findBy );
}
//endregion
}