/*-
 * ============LICENSE_START=======================================================
 * OSAM
 * ================================================================================
 * Copyright (C) 2018 AT&T
 * ================================================================================
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============LICENSE_END=========================================================
 */



package org.onap.ecomp.vid.selenium;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.TimeUnit;

import org.apache.log4j.Logger;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

@Test(enabled=false)
public class LogOutLeftPane {

	WebElement loginButton;
	
	/** The login. */
	WebElement login;
	
	/** The pwd. */
	WebElement pwd;
	
	/** The log. */
	Logger log;
	
	/** The errormessage. */
	WebElement errormessage;
	
	/** The driver. */
	WebDriver driver=new FirefoxDriver();
	
	
	/** The config prop. */
	private final Properties configProp = new Properties();
	
	
	/**
	 * Instantiates a new log out left pane.
	 */
	private  LogOutLeftPane() {
		// TODO Auto-generated constructor stub
		//
		try{
		//	InputStream input =this.getClass().getClassLoader().getResourceAsStream("objectmap.properties");
		//FileInputStream input1 = new FileInputStream("objectmap.properties");
			
		InputStream input =new FileInputStream("objectconfig.properties");
		System.out.println("Read all properties from file");
		configProp.load(input);
		System.out.println("Read all properties from file completed");
		}
		catch(IOException e) {
			
			e.printStackTrace();
		}
	}
	
	
	   
	   
	/**
	 * Do before test.
	 */
	// TODO Auto-generated method stub
	@BeforeTest
	public void doBeforeTest()
	{
		//WebDriver driver=new FirefoxDriver();
		
		log = Logger.getLogger(LogOutLeftPane.class.getName());
	
	
	
	// Get url
	driver.get("http://vid.onap.org:9080/vid/login_external.htm");
	driver.manage().window().maximize();
	
	
	 login = driver.findElement(By.xpath("//input[@class='fn-ebz-text ng-pristine ng-valid']"));
	 pwd = driver.findElement(By.xpath("//input[@class='span3 ng-pristine ng-valid']"));
	 loginButton = driver.findElement(By.id("loginBtn"));
	}
	
	
	/**
	 * Expand collapse panel.
	 *
	 * @throws InterruptedException the interrupted exception
	 */
	@Test(priority=1)
	public void expandCollapsePanel() throws InterruptedException
	{

		
		
		login.clear();
		login.sendKeys("su");
		pwd.clear();
		pwd.sendKeys("fusion");
		//driver.findElement(By.partialLinkText("Click here to login")).click();
		//driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
		
		loginButton.click();
		driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
		
		
		log.info("Clicking Profile link from left pane");
		Thread.sleep(3000);
		System.out.println("properties file details --->"+configProp.getProperty("profilelink"));
		driver.findElement(By.xpath(configProp.getProperty("profilelink"))).click();
		Thread.sleep(3000);
		
		//Verify whether the sub panel is displayed
		//To verify the following :Search import from webphone and Self 
		driver.findElement(By.xpath(".//*[@id='panel4']")).isDisplayed();
		log.info("Expand and collapse passed for Profile link");
		
		//For Admin
		//Verify expand and collapse working for ADMIN
		log.info("Clicking Admin link from left pane");
		driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[6]/a/span")).click();
		//To verify the following: Roles, Roles Functions, Usages
		driver.findElement(By.xpath(".//*[@id='panel5']")).isDisplayed();
		
	
		log.info("Expand and collapse passed for ADMIN link");

		log.info("VID-11 TC-3 PASSED");
		
	}
	
	
	/**
	 * Drop down list.
	 *
	 * @throws InterruptedException the interrupted exception
	 */
	@Test(priority=2)
	public void dropDownList() throws InterruptedException
	{
		//VID-12 TC-3
		log.info("VID-12 TC-3");
		//driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select"));
		
		//driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[2]/td[2]/div/select"));
		Thread.sleep(5000);
		
		//Infrastructure Subscriber Name
		Select oSelect = new Select(driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select")));
		Select iSelect = new Select(driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[2]/td[2]/div/select")));
		
		List <WebElement> elementCount = oSelect.getOptions();
		log.info("Subscriber Name Drop Down");
		System.out.println(elementCount.size());
		oSelect.selectByIndex(1);
		log.info("Subscriber name selected");
		//String selectedOption = new Select(driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select"))).getFirstSelectedOption().getText();
		
		
		List <WebElement> count = iSelect.getOptions();
		log.info("Subscriber type drop down");
		System.out.println(count.size());
		oSelect.selectByIndex(1);
		log.info("Subscriber type selected");
		

				
		//Submit button is clicked
		driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[3]/td/div/button")).click();
		
		
		//Verify whether the page header is displayed "Selected Subscriber's Service Instance Details:"
		driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/h1")).isDisplayed();
		log.info("VID-12 TC-3 PASSED");
	}
	
	
	
	
	/**
	 * Logout left pane.
	 */
	@Test(priority=3)
	public void logoutLeftPane()
	{
		//To Verify if the logout link redirects to Login page when clicked.
		
		
		/*log.info("----------------VID-11 TC-4----------------");
		login.clear();
		login.sendKeys("testuser");
		pwd.clear();
		pwd.sendKeys("abc123");
		//driver.findElement(By.partialLinkText("Click here to login")).click();
		//driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
		
		loginButton.click();
		driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);*/
		log.info("----------------VID-11 TC-4----------------");
		driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[7]/a")).click();
		//Validate that the user has logged out of VID. Displays "Portal"
		Assert.assertTrue(driver.getPageSource().contains("Portal"));
		
		log.info("VID 11 TC-4 PASSED");
		
		driver.close();
		
	}
	
}
