/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */
package org.apache.openmeetings.test.selenium;

import java.util.Date;

import org.junit.Test;
import org.openqa.selenium.Alert;
import org.openqa.selenium.WebElement;

import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButtons;

public class TestSignUp extends AbstractTestDefaults {
	
	String pass = "pass";
	
	@Override
	public boolean getDoTearDownAfterTest() {
		return false;
	}

	@Test
	public void testSignUp() throws Exception {
		
		try {
			driver.get(getBASE_URL());
			
			String currentRandomCounter = "" + ((new Date().getTime())/1000);
			String userName = "seba" + currentRandomCounter;
			String email = "hans." + currentRandomCounter + "@openmeetings.apache.org";
			
			super.testIsInstalledAndDoInstallation();
			
			WebElement signUpButton = SeleniumUtils.findElement(driver,
					"//button[span[contains(text(), '" + getString(123) + "')]]", true, true);
			signUpButton.click();
			
			// ##################################
			// Test validation message for passwords to be identical
			// ##################################
			doSignUp("Hans","Muster", userName, "pw", "pw2", email);
			
			//Find Error label-id 232 "Please enter two identical passwords"
			SeleniumUtils.findElement(driver, "//span[@class='feedbackPanelERROR'][contains(text(), '" + getString(232) + "')]", true, true);
			
			
			// ##################################
			// Sign up with user and sign in
			// ##################################
			doSignUp("Hans","Muster", userName, pass, pass, email);
			
			
			//Check for popup with success message and email to check
			//Labelid 674
			SeleniumUtils.findElement(driver, "//span[contains(text(), '" + getString(674) + "')]", true, true);
			
			//click button to close popup
			WebElement signUpSucessPopUpOkButton = SeleniumUtils.findElement(driver,
					"//button[span[contains(text(), '" + DialogButtons.OK.toString() + "')]]", true, true);
			signUpSucessPopUpOkButton.click();
			
			//Login with user
			SeleniumUtils.inputText(driver, "login", userName);
			SeleniumUtils.inputText(driver, "pass", pass);
	
			//click labelid 112 "Sign In"
			WebElement signInButton = SeleniumUtils.findElement(driver,
					"//button[span[contains(text(), '" + getString(112) + "')]]", true, true);
			signInButton.click();
	
			// check for some text in dashbaord, labelid 281, "Help and support"
			SeleniumUtils.elementExists(driver,
					"//h3[contains(text(), '" + getString(281) + "')]", true);
			
			//sign out
			WebElement signOutLink = SeleniumUtils.findElement(driver,
					"//a[contains(text(), '" + getString(310) + "')]", true, true);
			signOutLink.click();
			
			Alert alert = driver.switchTo().alert();
			alert.accept();
			
			// ##################################
			// Sign up with same user and email and check duplicate messages
			// ##################################
			
			signUpButton = SeleniumUtils.findElement(driver,
					"//button[span[contains(text(), '" + getString(123) + "')]]", true, true);
			signUpButton.click();
			
			doSignUp("Hans","Muster", userName, pass, pass, email);
			
			//Find Error label-id 105, The username is already used
			SeleniumUtils.findElement(driver, "//span[@class='feedbackPanelERROR'][contains(text(), '" + getString(105) + "')]", true, true);
			
			//Find Error label-id 1000, This email is already used by another user.
			SeleniumUtils.findElement(driver, "//span[@class='feedbackPanelERROR'][contains(text(), '" + getString(1000) + "')]", true, true);
		} catch (Exception e) {
			SeleniumUtils.makeScreenShot(this.getClass().getSimpleName(), e,
					driver);
			throw e;
		}	
	}
	
	private void doSignUp(String firstName, String lastName, String login, String password,
					String confirmPassword, String email) throws Exception {
		
		SeleniumUtils.inputText(driver, "firstName", firstName);
		SeleniumUtils.inputText(driver, "lastName", lastName);
		SeleniumUtils.inputText(driver, "//input[@name='login']", login);
		SeleniumUtils.inputText(driver, "password", password);
		SeleniumUtils.inputText(driver, "confirmPassword", confirmPassword);
		SeleniumUtils.inputText(driver, "email", email);
		
		WebElement submitButton = SeleniumUtils.findElement(driver,
				"//button[span[contains(text(), 'Register')]]", true, true);
		submitButton.click();
	}
}
