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();
        } 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);
    }

    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();
        System.out.println(result);
        String[] resultLines = result.split("\n");
        String actual = resultLines[3].substring(0,9);
        assertEquals("  5 S @.-",actual);
        highways.applyColorToHighwayStretch(241, Station.DIRECTION.NORTH, 18.08, 1.0, 
                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, 20.13, 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");
        assertEquals("5 S 0.9", id1);
        JSONObject item2 = (JSONObject)array.get(1);
        String id2 = (String) item2.get("id");
        assertEquals("5 N 1.26", id2);
        JSONObject item3 = (JSONObject)array.get(2);
        String id3 = (String) item3.get("id");
        assertEquals("5 S 1.49", id3);
    }
   
    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, 0.1, 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";
    
}
