package edu.ncsu.csc.itrust.selenium;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import java.text.SimpleDateFormat;  
import java.util.Date; 
import java.util.List;

public class SendRemindersTest extends iTrustSeleniumTest{

    protected WebDriver driver;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        gen.clearAllTables();
        gen.standardData();
    }

    // Test sending reminders
	public void testSendReminder() throws Exception {
		// Login as admin
        driver = login("9000000001", "pw");
        assertEquals("iTrust - Admin Home", driver.getTitle());
        driver.findElement(By.linkText("Send Appointment Reminders")).click();

        // Send reminders
        driver.findElement(By.name("withinDays")).sendKeys("10");
        driver.findElement(By.name("withinDays")).submit();
        assertEquals("Reminders were successfully sent",
        driver.findElement(By.className("iTrustMessage")).getText());

        // Create timestamp
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
		Date date = new Date();
		String stamp = dateFormat.format(date);

        // Check admin reminders outbox
        driver.findElement(By.linkText("Reminder Message Outbox")).click();
        assertNotNull(driver.findElement(By.className("fancyTable")));
        assertTrue(driver.getPageSource().contains(stamp));

        // Check a reminder message
        driver.findElement(By.linkText("Read")).click();
        assertTrue(driver.getPageSource().contains(stamp));
		
        // Logout admin and login as patient
		List<WebElement> links = driver.findElements(By.tagName("a"));
		int count = 0;
		for(int i = 0; i < links.size(); i++) {
			if(links.get(i).getAttribute("href").contains("logout"))
			{
				count = i;
				break;
			}
		}
		links.get(count).click();
		driver = login("5", "pw");
		
		// Check patient inbox
        driver.findElement(By.linkText("Message Inbox")).click();
        int index = 1;
        WebElement baseTable = driver.findElement(By.cssSelector(".display.fTable"));
        List<WebElement> tableRows = baseTable.findElements(By.tagName("tr"));
        assertTrue(tableRows.get(index).getText().contains("System Reminder"));
        assertTrue(tableRows.get(index).getText().contains("Reminder: upcoming appointment"));
        index++;
        assertTrue(tableRows.get(index).getText().contains("Reminder: upcoming appointment"));
        assertTrue(tableRows.get(index).getText().contains(stamp));
    }

    // Test invalid number of days input for sending reminders
	public void testInvalidSendReminder() throws Exception {

        // Login as admin
        driver = login("9000000001", "pw");
        assertEquals("iTrust - Admin Home", driver.getTitle());
        driver.findElement(By.linkText("Send Appointment Reminders")).click();

        // Send reminder with negative days
        driver.findElement(By.name("withinDays")).sendKeys("-4");
        driver.findElement(By.name("withinDays")).submit();
        assertEquals("Provide a positive number",
        driver.findElement(By.className("iTrustError")).getText());
    
        // Send reminder with non-numberic days
        driver.findElement(By.name("withinDays")).sendKeys("Hello");
        driver.findElement(By.name("withinDays")).submit();
        assertEquals("Reminders failed to send. Please provide a positive number",
        driver.findElement(By.className("iTrustError")).getText());
    }



    
}