package com.framework.site.objects.header;
import ch.lambdaj.Lambda;
import com.framework.asserts.JAssertion;
import com.framework.driver.event.HtmlElement;
import com.framework.driver.event.HtmlObject;
import com.framework.driver.exceptions.ApplicationException;
import com.framework.driver.exceptions.UrlNotAvailableException;
import com.framework.driver.objects.AbstractWebObject;
import com.framework.driver.objects.Link;
import com.framework.site.objects.header.enums.LevelOneMenuItem;
import com.framework.site.objects.header.interfaces.Header;
import com.framework.site.pages.BaseCarnivalPage;
import com.framework.site.pages.bookedguest.BookedGuestLogonPage;
import com.framework.site.pages.core.CruisingPage;
import com.google.common.base.Optional;
import com.google.common.base.Splitter;
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.matchers.JMatchers.containsString;
import static com.framework.utils.matchers.JMatchers.is;
/**
* Created with IntelliJ IDEA ( LivePerson : www.liveperson.com )
*
* Package: com.framework.site.objects.header
*
* Name : HeaderLinksObject
*
* User : solmarkn / Dani Vainstein
*
* Date : 2015-01-06
*
* Time : 11:34
*/
class HeaderLinksObject extends AbstractWebObject implements Header.HeaderLinks
{
//region HeaderLinksObject - Variables Declaration and Initialization Section.
private static final Logger logger = LoggerFactory.getLogger( HeaderLinksObject.class );
// ------------------------------------------------------------------------|
// --- WEB-OBJECTS CACHING ------------------------------------------------|
// ------------------------------------------------------------------------|
private HtmlElement ul_pull_left, ul_pull_right;
private HtmlElement data_ccl_flyout_learn, data_ccl_flyout_explore, data_ccl_flyout_manage, data_ccl_flyout_plan;
private HtmlElement notification_flag, li_log, li_search;
private HtmlElement ccl_header_expand_login_link, greeting, join;
private HtmlElement glass_search;
private List<HtmlElement> span_org;
//endregion
//region HeaderLinksObject - Constructor Methods Section
HeaderLinksObject( final HtmlElement rootElement )
{
super( rootElement, Header.HeaderLinks.LOGICAL_NAME );
initWebObject();
}
//endregion
//region HeaderLinksObject - Initialization and Validation Methods Section
@Override
protected void initWebObject()
{
logger.info( "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( ".header-links ul.pull-right" ), FIVE_SECONDS );
assertion.assertThat( String.format( REASON, ".header-links ul.pull-right" ), e.isPresent(), is( true ) );
this.ul_pull_right = e.get();
e = getRoot().childExists( By.cssSelector( ".header-links ul.pull-left" ), FIVE_SECONDS );
assertion.assertThat( String.format( REASON, ".header-links ul.pull-left" ), e.isPresent(), is( true ) );
this.ul_pull_left = e.get();
}
//endregion
//region HeaderLinksObject - Service Methods Section
private HtmlElement getRoot()
{
return getBaseRootElement( Header.HeaderLinks.ROOT_BY );
}
private List<String> getDataHighLightPattern( LevelOneMenuItem item )
{
String highLightPattern = findLevelOneMenuItemAnchor( item ).getAttribute( "data-highlightpattern" );
return Splitter.on( "|" ).splitToList( highLightPattern );
}
//endregion
//region HeaderLinksObject - Business Methods Section
@Override
public void hoverOnItem( final LevelOneMenuItem item )
{
logger.info( "hovering over level-one element item < '{}' >", item.getTitle() );
Link link = new Link( findLevelOneMenuItemAnchor( item ) );
link.hover( false );
findLevelOneMenuItemAnchor( item ).waitAttributeToMatch( "class", containsString( " hover " ), FIVE_SECONDS );
}
@Override
public BaseCarnivalPage clickItem( final LevelOneMenuItem item )
{
logger.info( "clicking on level-one element item < '{}' >", item.getTitle() );
try
{
Link link = new Link( findLevelOneMenuItemAnchor( item ) );
link.checkReference( 5000 );
link.click();
CruisingPage cp = new CruisingPage( );
logger.info( "returning a new page instance -> '{}'", cp );
return cp;
}
catch ( UrlNotAvailableException e )
{
throw new ApplicationException( e );
}
}
@Override
public Link getLink( final LevelOneMenuItem item )
{
return new Link( findLevelOneMenuItemAnchor( item ) );
}
@Override
public String[] getLinkNames()
{
List<HtmlElement> spans = fidItemsOrgSpans();
List<String> names = HtmlObject.extractAttribute( spans, "textContent" );
logger.info( "returning a list of top-level links names [ {} ] ...", Lambda.join( names, ", " ) );
return names.toArray( new String[ names.size() ] );
}
@Override
public BookedGuestLogonPage clickLogin()
{
logger.info( "clicking on login ..." );
Link login = new Link( findExpandLoginLinkAnchor() );
login.hover( true );
login.click();
return new BookedGuestLogonPage();
}
@Override
public String getGreeting()
{
logger.info( "reading greeting span element ..." );
HtmlElement greetingSpan = findGreetingSpan();
HtmlElement join = findJoinAnchor();
return greetingSpan.getText() + join.getText();
}
@Override
public Link getGreetingLink()
{
logger.info( "reading greeting link ..." );
return new Link( findJoinAnchor() );
}
@Override
public Link getLoginLink()
{
logger.info( "reading login link ..." );
return new Link( findExpandLoginLinkAnchor() );
}
//endregion
//region HeaderLinksObject - Element Finder Methods Section
private HtmlElement findUlPullLeft()
{
final By findBy = By.cssSelector( ".header-links ul.pull-left" );
if( null == this.ul_pull_left )
{
this.ul_pull_left = getDriver().findElement( findBy );
}
return this.ul_pull_left;
}
private HtmlElement findUlPullRight()
{
final By findBy = By.cssSelector( ".header-links ul.pull-right" );
if( null == this.ul_pull_right )
{
this.ul_pull_right = getDriver().findElement( findBy );
}
return this.ul_pull_right;
}
private HtmlElement findLevelOneMenuItemAnchor( LevelOneMenuItem item )
{
final By findBy = By.cssSelector( String.format( "a[data-ccl-flyout='%s']", item.name().toLowerCase() ) );
switch ( item )
{
case LEARN:
{
if( null == this.data_ccl_flyout_learn )
{
this.data_ccl_flyout_learn = findUlPullLeft().findElement( findBy );
}
return data_ccl_flyout_learn;
}
case PLAN:
{
if( null == this.data_ccl_flyout_plan )
{
this.data_ccl_flyout_plan = findUlPullLeft().findElement( findBy );
}
return data_ccl_flyout_plan;
}
case MANAGE:
{
if( null == this.data_ccl_flyout_manage )
{
this.data_ccl_flyout_manage = findUlPullLeft().findElement( findBy );
}
return data_ccl_flyout_manage;
}
case EXPLORE:
{
if( null == this.data_ccl_flyout_explore )
{
this.data_ccl_flyout_explore = findUlPullLeft().findElement( findBy );
}
return data_ccl_flyout_explore;
}
default:
return null;
}
}
private HtmlElement findNotificationFlag()
{
final By findBy = By.className( "notification-flag" );
if( null == this.notification_flag )
{
this.notification_flag = findUlPullRight().findElement( findBy );
}
return this.notification_flag;
}
private HtmlElement findExpandLoginLinkAnchor()
{
final By findBy = By.id( "ccl_header_expand-login-link" );
if( null == this.ccl_header_expand_login_link )
{
this.ccl_header_expand_login_link = getDriver().findElement( findBy );
}
return this.ccl_header_expand_login_link;
}
private HtmlElement findLogLi()
{
final By findBy = By.className( "log" );
if( null == this.li_log )
{
this.li_log = findUlPullRight().findElement( findBy );
}
return this.li_log;
}
private HtmlElement findGreetingSpan()
{
final By findBy = By.id( "greeting" );
if( null == this.greeting )
{
this.greeting = findUlPullRight().findElement( findBy );
}
return this.greeting;
}
private HtmlElement findJoinAnchor()
{
final By findBy = By.id( "join" );
if( null == this.join )
{
this.join = findUlPullRight().findElement( findBy );
}
return this.join;
}
private HtmlElement findSearchLi()
{
final By findBy = By.className( "search" );
if( null == this.li_search )
{
this.li_search = findUlPullRight().findElement( findBy );
}
return this.li_search;
}
private HtmlElement findGlassSearchAnchor()
{
final By findBy = By.id( "glass_search" );
if( null == this.glass_search )
{
this.glass_search = getDriver().findElement( findBy );
}
return this.glass_search;
}
private List<HtmlElement> fidItemsOrgSpans()
{
final By findBy = By.className( "org" );
if( null == this.span_org )
{
this.span_org = findUlPullLeft().findElements( findBy );
}
return this.span_org;
}
//endregion
}