package com.github.freeacs.web;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.freeacs.common.util.AbstractEmbeddedDataSourceClassTest;
import com.github.freeacs.common.util.Sleep;
import com.github.freeacs.web.app.util.Freemarker;
import com.github.freeacs.web.app.util.WebProperties;
import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;
import com.zaxxer.hikari.HikariDataSource;
import freemarker.template.Configuration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.WebElement;
import spark.Spark;

import java.sql.SQLException;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

public class AppTest extends AbstractEmbeddedDataSourceClassTest {

  private static SeleniumTest seleniumTest;

  @BeforeClass
  public static void setUp() throws SQLException {
    ValueInsertHelper.insert(dataSource);
    Config baseConfig = ConfigFactory.load("application.conf");
    WebProperties properties = new WebProperties(baseConfig);
    Configuration configuration = Freemarker.initFreemarker();
    ObjectMapper objectMapper = new ObjectMapper();
    App.routes(dataSource, properties, configuration, objectMapper);
    Spark.awaitInitialization();
    seleniumTest =
        new SeleniumTest(
            "http://localhost:" + properties.getServerPort() + properties.getContextPath());
  }

  @AfterClass
  public static void tearDown() throws SQLException {
    seleniumTest.closeWindow();
    Spark.stop();
    Sleep.terminateApplication();
    dataSource.unwrap(HikariDataSource.class).close();
  }

  @Test
  public void test() throws InterruptedException {
    String actualTitle = seleniumTest.getTitle();
    assertNotNull(actualTitle);
    assertEquals("FreeACS Web | login", actualTitle);
    seleniumTest.doLogin();
    WebElement searchButton = seleniumTest.getElementById("submitSearchButton");
    assertEquals("FreeACS Web | Search", seleniumTest.getTitle());
    searchButton.click();
    WebElement unitLink = seleniumTest.getLinkByText("test123");
    unitLink.click();
    WebElement unitConfigurationLink = seleniumTest.getLinkByText("Go to Unit configuration");
    assertEquals(
        "FreeACS Web | Unit Dashboard | test123 | Default | Test", seleniumTest.getTitle());
    unitConfigurationLink.click();
    Thread.sleep(1000);
    WebElement logoutLink = seleniumTest.getLinkByText("Logout");
    logoutLink.click();
    WebElement loginButton = seleniumTest.getElementByName("login");
    assertEquals("FreeACS Web | login", seleniumTest.getTitle());
    assertNotNull(loginButton);
  }
}