package atmsdriver.model;

import archive.ATMSDriver;
import atmsdriver.model.LoopDetector.DOTCOLOR;
import atmsdriver.model.Station.DIRECTION;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import junit.framework.TestCase;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

/**
 *
 * @author jdalbey
 */
public class HighwaysTest extends TestCase {

    public HighwaysTest(String testName) {
        super(testName);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        PrintWriter writer = null;
        try {
            writer = new PrintWriter(new FileWriter("test/atmsdriver/model/ldssample.txt"));
            writer.println("2");
            writer.println("32 0 2");
            writer.println("1210831 1 5 S 0.9 4 CALAFIA");
            writer.println("1210832 ML ML_1");
            writer.println("1210833 ML ML_2");
            writer.println("1210834 ML ML_3");
            writer.println("1210835 ML ML_4");
            writer.println("1210845 2 5 S 1.49 4 EL CAMINO REAL");
            writer.println("1210846 ML ML_1");
            writer.println("1210847 ML ML_2");
            writer.println("1210848 ML ML_3");
            writer.println("1210849 ML ML_4");
            writer.println("74 0 1");
            writer.println("1204203 2 5 N 1.26 4 MAGDALENA");
            writer.println("1204212 ML ML_1");
            writer.println("1204213 ML ML_2");
            writer.println("1204214 ML ML_3");
            writer.println("1204215 ML ML_4");
            writer.close();
            
            writer = new PrintWriter(new FileWriter("test/atmsdriver/model/ldssample2.txt"));
            writer.println("1");
            writer.println("44 0 6");
            writer.println("1204390 6 5 S 7.99 5 AEROPUERTO");
            writer.println("1204391 ML ML_1");
            writer.println("1204392 ML ML_2");
            writer.println("1204393 ML ML_3");
            writer.println("1204394 ML ML_4");
            writer.println("1210062 ML ML_5");
            writer.println("1204384 5 5 N 7.46 4 CAPISTRANO");
            writer.println("1204385 ML ML_1");
            writer.println("1204386 ML ML_2");
            writer.println("1204387 ML ML_3");
            writer.println("1204388 ML ML_4");
            writer.println("1204316 1 5 N 5.73 4 ESTRELLA1");
            writer.println("1204317 ML ML_1");
            writer.println("1204318 ML ML_2");
            writer.println("1204319 ML ML_3");
            writer.println("1204320 ML ML_4");
            writer.println("1204340 3 5 N 6.47 4 SACRAMENTO");
            writer.println("1204341 ML ML_1");
            writer.println("1204342 ML ML_2");
            writer.println("1204343 ML ML_3");
            writer.println("1204344 ML ML_4");
            writer.println("1204345 3 5 S 6.47 5 SACRAMENTO");
            writer.println("1204346 OS OS_1");
            writer.println("1204347 OS OS_2");
            writer.println("1204348 OS OS_3");
            writer.println("1204349 OS OS_4");
            writer.println("1204350 OS OS_5");
            writer.println("1211075 5 5 S 7.46 5 CAPISTRANO");
            writer.println("1211069 OS OS_1");
            writer.println("1211070 OS OS_2");
            writer.println("1211071 OS OS_3");
            writer.println("1211072 OS OS_4");
            writer.println("1211073 OS OS_5");
            writer.close();

            writer = new PrintWriter(new FileWriter("test/atmsdriver/model/ldssample3.txt"));
            writer.println("1");
            writer.println("44 0 6");
            writer.println("1204390 6 73 N 23.9 5 BISON 2");
            writer.println("1204391 ML ML_1");
            writer.println("1204392 ML ML_2");
            writer.println("1204393 ML ML_3");
            writer.println("1204394 ML ML_4");
            writer.println("1210062 ML ML_5");
            writer.println("1204384 2 55 S 6.88 4 MACARTHU1");
            writer.println("1204385 ML ML_1");
            writer.println("1204386 ML ML_2");
            writer.println("1204387 ML ML_3");
            writer.println("1204388 ML ML_4");
            writer.println("1204316 1 5 N 5.73 4 ESTRELLA1");
            writer.println("1204317 ML ML_1");
            writer.println("1204318 ML ML_2");
            writer.println("1204319 ML ML_3");
            writer.println("1204320 ML ML_4");
            writer.println("1204340 3 5 N 6.47 4 SACRAMENTO");
            writer.println("1204341 ML ML_1");
            writer.println("1204342 ML ML_2");
            writer.println("1204343 ML ML_3");
            writer.println("1204344 ML ML_4");
            writer.println("1204345 4 405 N 6.21 5 HARVARD");
            writer.println("1204346 OS OS_1");
            writer.println("1204347 OS OS_2");
            writer.println("1204348 OS OS_3");
            writer.println("1204349 OS OS_4");
            writer.println("1204350 OS OS_5");
            writer.println("1211075 5 405 S 6.8 5 JAMBOREE1");
            writer.println("1211069 OS OS_1");
            writer.println("1211070 OS OS_2");
            writer.println("1211071 OS OS_3");
            writer.println("1211072 OS OS_4");
            writer.println("1211073 OS OS_5");
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
        Path path = FileSystems.getDefault().getPath("test/atmsdriver/model", "ldssample.txt");
        Files.delete(path);
        path = FileSystems.getDefault().getPath("test/atmsdriver/model", "ldssample2.txt");
        Files.delete(path);
        path = FileSystems.getDefault().getPath("test/atmsdriver/model", "ldssample3.txt");
        Files.delete(path);
    }

    public void testFindStation()
    {
        System.out.println("test FindStation()");
        Highways highways = new Highways(
                "test/atmsdriver/model/ldssample.txt",
                "localhost", 8080);
        assertTrue(null != highways.findStation(5, DIRECTION.SOUTH, 0.9));
        assertTrue(null != highways.findStation(5, DIRECTION.SOUTH, 1.49));
        assertTrue(null != highways.findStation(5, DIRECTION.NORTH, 1.26));
        assertTrue(null == highways.findStation(5, DIRECTION.SOUTH, 1.1));
    }
    /**
     * Test of toString method
     */
    public void testToString() {
        System.out.println("toString");
        Highways highways = new Highways(
                "config/vds_data/highways_fullmap.txt",
                "localhost", 8080);
        highways.getHighwayByRouteNumber(5).stations.get(0).loops.get(0).vol = 1;
        String result = highways.toString();
        String[] resultLines = result.split("\n");
        String actual = resultLines[3].substring(0,9);
        assertEquals("  5 S @.-",actual);
        highways.applyColorToHighwayStretch(241, Station.DIRECTION.NORTH, 18.8, 0.8, 
                LoopDetector.DOTCOLOR.RED);
        result = highways.toString();
        System.out.println("bravo:\n"+result);
        assertEquals("241 N -@.@@.-",result.substring(0,13));
        highways.applyColorToHighwayStretch(241, Station.DIRECTION.SOUTH, 18.8, 2.0, 
                LoopDetector.DOTCOLOR.YELLOW);
        result = highways.toString();
        System.out.println("charly:\n"+result);
        resultLines = result.split("\n");
        actual = resultLines[1].substring(0,16);
        assertEquals("241 S ..-..+.++.",actual);
    }


    public void testToJson() throws ParseException {
        System.out.println("toJson");
        Highways highways = new Highways(
                "test/atmsdriver/model/ldssample.txt",
                "localhost", 8080);
        String result = highways.toJson();
        System.out.println(result);
        assertTrue(result.indexOf("33.416348") > 0);
        JSONParser parser = new JSONParser();
        JSONObject obj = (JSONObject) parser.parse(result);
        System.out.println(obj);
        JSONArray array = (JSONArray)obj.get("features");
        JSONObject item1 = (JSONObject)array.get(0);
        String id1 = (String) item1.get("id");
        JSONObject item2 = (JSONObject)array.get(1);
        String id2 = (String) item2.get("id");
        JSONObject item3 = (JSONObject)array.get(2);
        String id3 = (String) item3.get("id");
        assertEquals("5 N 1.26", id1);
        assertEquals("5 S 0.9", id2);
        assertEquals("5 S 1.49", id3);
    }
    public void testStationSort() throws ParseException {
        System.out.println("stationSort");
        Highways highways = new Highways(
                "test/atmsdriver/model/ldssample2.txt",
                "localhost", 8080);
        String result = highways.toJson();
        JSONParser parser = new JSONParser();
        JSONObject obj = (JSONObject) parser.parse(result);
        JSONArray array = (JSONArray)obj.get("features");
        JSONObject item1 = (JSONObject)array.get(0);
        String id1 = (String) item1.get("id");
        JSONObject item2 = (JSONObject)array.get(1);
        String id2 = (String) item2.get("id");
        JSONObject item3 = (JSONObject)array.get(2);
        String id3 = (String) item3.get("id");
        assertEquals("5 N 5.73", id1);
        assertEquals("5 N 6.47", id2);
        assertEquals("5 N 7.46", id3);
        JSONObject item4 = (JSONObject)array.get(3);
        String id4 = (String) item4.get("id");
        JSONObject item5 = (JSONObject)array.get(4);
        String id5 = (String) item5.get("id");
        assertEquals("5 S 6.47", id4);
        assertEquals("5 S 7.46", id5);
    }
    public void testRouteSort() throws ParseException {
        System.out.println("routeSort");
        Highways highways = new Highways(
                "test/atmsdriver/model/ldssample3.txt",
                "localhost", 8080);
        String result = highways.toJson();
        JSONParser parser = new JSONParser();
        JSONObject obj = (JSONObject) parser.parse(result);
        JSONArray array = (JSONArray)obj.get("features");
        JSONObject item1 = (JSONObject)array.get(0);
        String id1 = (String) item1.get("id");
        JSONObject item2 = (JSONObject)array.get(1);
        String id2 = (String) item2.get("id");
        JSONObject item3 = (JSONObject)array.get(2);
        String id3 = (String) item3.get("id");
        JSONObject item4 = (JSONObject)array.get(3);
        String id4 = (String) item4.get("id");
        JSONObject item5 = (JSONObject)array.get(4);
        String id5 = (String) item5.get("id");
        assertEquals("5 N 5.73", id1);
        assertEquals("5 N 6.47", id2);
        assertEquals("55 S 6.88", id3);
        assertEquals("73 N 23.9", id4);
        assertEquals("405 N 6.21", id5);
    }
   
    public void testApplyColor()
    {
        System.out.println("apply color");
        Highways highways = new Highways(
            "test/atmsdriver/model/ldssample.txt",
            "localhost", 8080);
        highways.applyColorToHighwayStretch(5, Station.DIRECTION.SOUTH, 0.9, 2.0, 
                LoopDetector.DOTCOLOR.RED);
        Station target = highways.findStation(5, DIRECTION.SOUTH, 0.9);
        assertEquals('@',target.getColor());
        String result = highways.toString();
        System.out.println("applyto:\n"+result);
        assertEquals("5 N .-.\n  5 S @.@", result.trim());
        
        highways.applyColorToHighwayStretch(5, Station.DIRECTION.SOUTH, 1.49, 2.0, 
                LoopDetector.DOTCOLOR.YELLOW);
        result = highways.toString();
        assertEquals("5 N .-.\n  5 S @.+", result.trim());
        
        highways.applyColorToHighwayStretch(5, Station.DIRECTION.SOUTH, 1.49, 0.59, 
                LoopDetector.DOTCOLOR.GREEN);
        result = highways.toString();
        assertEquals("5 N .-.\n  5 S @.-", result.trim());

        highways.applyColorToHighwayStretch(5, Station.DIRECTION.NORTH, 1.83, 2.0, 
                LoopDetector.DOTCOLOR.RED);
        result = highways.toString();
        assertEquals("5 N .@.\n  5 S @.-", result.trim());
        
        //highways.applyColorToHighwayStretch(241, Station.DIRECTION.NORTH, 20.13, 4.0, LoopDetector.DOTCOLOR.RED);
        //result = highways.toString();
        //assertTrue(result.length()>0); //"241 N @@ @@@@@-",result.substring(0,15));

    }            
    
    public void testToCondensedFormat()
    {
        System.out.println("ToCondensedFormat");
        Highways highways = new Highways(
                "test/atmsdriver/model/ldssample.txt",
                "localhost", 8080);

        String actualCondensedFormatMeta = highways.toCondensedFormat(true);
        String actualCondensedFormatFEP = highways.toCondensedFormat(false);
        System.out.println(actualCondensedFormatMeta);
        
        assertEquals(expectedCondensedFormatFEP, actualCondensedFormatFEP);
        assertEquals(expectedCondensedFormatMeta, actualCondensedFormatMeta);
    }
    String expectedCondensedFormatMeta = 
            "2\n" +
            "32 0 2\n" +
            "1210831 1 5 S 0.9 4 CALAFIA\n" +
            "1210832 ML ML_1\n" +
            "1210833 ML ML_2\n" +
            "1210834 ML ML_3\n" +
            "1210835 ML ML_4\n" +
            "1210845 2 5 S 1.49 4 EL CAMINO REAL\n" +
            "1210846 ML ML_1\n" +
            "1210847 ML ML_2\n" +
            "1210848 ML ML_3\n" +
            "1210849 ML ML_4\n" +
            "74 0 1\n" +
            "1204203 2 5 N 1.26 4 MAGDALENA\n" +
            "1204212 ML ML_1\n" +
            "1204213 ML ML_2\n" +
            "1204214 ML ML_3\n" +
            "1204215 ML ML_4\n";
    String expectedCondensedFormatFEP = 
            "2\n" +
            "32 0 2\n" +
            "1210831 1 5 S 0.9 4 \n" +
            "1210832  0.0 0 ML_1\n" +
            "1210833  0.0 0 ML_2\n" +
            "1210834  0.0 0 ML_3\n" +
            "1210835  0.0 0 ML_4\n" +
            "1210845 2 5 S 1.49 4 \n" +
            "1210846  0.0 0 ML_1\n" +
            "1210847  0.0 0 ML_2\n" +
            "1210848  0.0 0 ML_3\n" +
            "1210849  0.0 0 ML_4\n" +
            "74 0 1\n" +
            "1204203 2 5 N 1.26 4 \n" +
            "1204212  0.0 0 ML_1\n" +
            "1204213  0.0 0 ML_2\n" +
            "1204214  0.0 0 ML_3\n" +
            "1204215  0.0 0 ML_4\n";
    
}
