package org.weasis.core.ui.model.imp.suite;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.Test;
import org.weasis.core.api.media.data.ImageElement;
import org.weasis.core.ui.model.GraphicModel;
import org.weasis.core.ui.model.graphic.Graphic;
import org.weasis.core.ui.model.graphic.imp.AnnotationGraphicTest;
import org.weasis.core.ui.model.graphic.imp.PixelInfoGraphicTest;
import org.weasis.core.ui.model.graphic.imp.PointGraphicTest;
import org.weasis.core.ui.model.graphic.imp.angle.AngleToolGraphicTest;
import org.weasis.core.ui.model.graphic.imp.angle.CobbAngleToolGraphicTest;
import org.weasis.core.ui.model.graphic.imp.area.PolygonGraphicTest;
import org.weasis.core.ui.model.graphic.imp.area.RectangleGraphicTest;
import org.weasis.core.ui.model.graphic.imp.line.LineGraphicTest;
import org.weasis.core.ui.model.graphic.imp.line.ParallelLineGraphicTest;
import org.weasis.core.ui.model.graphic.imp.line.PolylineGraphicTest;
import org.weasis.core.ui.model.imp.XmlGraphicModel;
import org.weasis.core.ui.model.layer.Layer;
import org.weasis.core.ui.model.layer.LayerType;
import org.weasis.core.ui.test.utils.ModelListHelper;

public class SerializationSuite extends ModelListHelper {
    @Test
    public void test_empty_model() throws Exception {
        GraphicModel model = new XmlGraphicModel();
        model.setUuid(UUID_1);
        
        String actual = serialize(model);
        String expected = String.format(TPL_XML_PREFIX + "<presentation uuid=\"%s\"><references/><layers/><graphics/></presentation>", UUID_1); //$NON-NLS-1$
        assertThat(actual).isEqualTo(expected);
    }
    
    @Test
    public void test_add_one_point_graphic() throws Exception {
        GraphicModel model = new XmlGraphicModel();
        model.setUuid(UUID_1);
        
        Graphic graphic = PointGraphicTest.COMPLETE_OBJECT;
        model.addGraphic(graphic);
        
        assertThat(model.getLayers()).hasSize(1);
        Layer layer = model.getLayers().get(0);
        
        String actual = serialize(model);
        String expected = String.format(TPL_XML_PREFIX + 
            "<presentation uuid=\"%1$s\">" //$NON-NLS-1$
            +   "<references/>" //$NON-NLS-1$
            +   "<layers>" //$NON-NLS-1$
            +       "<layer level=\"40\" locked=\"false\" selectable=\"true\" type=\"DRAW\" visible=\"true\" uuid=\"%2$s\"/>" //$NON-NLS-1$
            +   "</layers>" //$NON-NLS-1$
            +   "<graphics>" //$NON-NLS-1$
            +       "<point pointSize=\"1\" fill=\"false\" showLabel=\"true\" thickness=\"3.0\" " //$NON-NLS-1$
            +           "uuid=\"%3$s\">" //$NON-NLS-1$
            +           "<paint rgb=\"ffff0000\"/>" //$NON-NLS-1$
            +           "<layer>%2$s</layer>" //$NON-NLS-1$
            +           "<pts>" //$NON-NLS-1$
            +               "<pt x=\"1665.5\" y=\"987.0\"/>" //$NON-NLS-1$
            +           "</pts>" //$NON-NLS-1$
            +       "</point>" //$NON-NLS-1$
            +   "</graphics>" //$NON-NLS-1$
            + "</presentation>",  //$NON-NLS-1$
            UUID_1, layer.getUuid(), graphic.getUuid());
        
        assertThat(actual).isEqualTo(expected);
    }
    
    @Test
    public void test_with_image_element() throws Exception {
        ImageElement img = mockImage(UUID_2, UUID_3);
        GraphicModel model = new XmlGraphicModel(img);
        model.setUuid(UUID_1);
        
        String actual = serialize(model);
        String expected = String.format(TPL_XML_PREFIX + 
            "<presentation uuid=\"%s\">" //$NON-NLS-1$
            +   "<references>" //$NON-NLS-1$
            +       "<series uuid=\"%s\">" //$NON-NLS-1$
            +           "<image frames=\"\" uuid=\"%s\"/>" //$NON-NLS-1$
            +       "</series>" //$NON-NLS-1$
            +   "</references>" //$NON-NLS-1$
            +   "<layers/>" //$NON-NLS-1$
            +   "<graphics/>" //$NON-NLS-1$
            + "</presentation>",  //$NON-NLS-1$
            UUID_1, UUID_3, UUID_2);
        
        assertThat(actual).isEqualTo(expected);
    }
    
    @Test
    public void test_with_mulitiple_graphics_and_one_layer() throws Exception {
        ImageElement img = mockImage(UUID_2, UUID_3);
        GraphicModel model = new XmlGraphicModel(img);
        model.setUuid(UUID_1);
        
        Graphic pointGraphic = PointGraphicTest.COMPLETE_OBJECT.copy();
        Graphic pixelInfoGraphic = PixelInfoGraphicTest.COMPLETE_OBJECT.copy();
        Graphic annotationGraphic = AnnotationGraphicTest.COMPLETE_OBJECT.copy();
        Graphic lineGraphic = LineGraphicTest.COMPLETE_OBJECT.copy();
        Graphic parallelLine = ParallelLineGraphicTest.COMPLETE_OBJECT.copy();
        Graphic polylineGraphic = PolylineGraphicTest.COMPLETE_OBJECT.copy();
        Graphic polygonGraphic = PolygonGraphicTest.COMPLETE_OBJECT.copy();
        Graphic rectangleGraphic = RectangleGraphicTest.COMPLETE_OBJECT.copy();
        Graphic angleGraphic = AngleToolGraphicTest.COMPLETE_OBJECT.copy();
        Graphic cobbAngleGraphic = CobbAngleToolGraphicTest.COMPLETE_OBJECT.copy();
        
        model.addGraphic(pointGraphic);
        model.addGraphic(pixelInfoGraphic);
        model.addGraphic(annotationGraphic);
        model.addGraphic(lineGraphic);
        model.addGraphic(parallelLine);
        model.addGraphic(polylineGraphic);
        model.addGraphic(polygonGraphic);
        model.addGraphic(rectangleGraphic);
        model.addGraphic(angleGraphic);
        model.addGraphic(cobbAngleGraphic);
        
        assertThat(model.getLayers()).hasSize(1);
        Layer layer = model.getLayers().get(0);
        
        assertThat(pointGraphic.getLayer()).isEqualTo(layer);
        assertThat(pixelInfoGraphic.getLayer()).isEqualTo(layer);
        assertThat(annotationGraphic.getLayer()).isEqualTo(layer);
        assertThat(lineGraphic.getLayer()).isEqualTo(layer);
        assertThat(polylineGraphic.getLayer()).isEqualTo(layer);
        assertThat(polygonGraphic.getLayer()).isEqualTo(layer);
        assertThat(rectangleGraphic.getLayer()).isEqualTo(layer);
        assertThat(angleGraphic.getLayer()).isEqualTo(layer);
        assertThat(cobbAngleGraphic.getLayer()).isEqualTo(layer);
        
        String actual = serialize(model);
        String expected = String.format(TPL_XML_PREFIX + 
            "<presentation uuid=\"%s\">" //$NON-NLS-1$
            +   "<references>" //$NON-NLS-1$
            +       "<series uuid=\"%s\">" //$NON-NLS-1$
            +           "<image frames=\"\" uuid=\"%s\"/>" //$NON-NLS-1$
            +       "</series>" //$NON-NLS-1$
            +   "</references>" //$NON-NLS-1$
            +   "<layers>" //$NON-NLS-1$
            +       serializeWithoutHeader(layer)
            +   "</layers>" //$NON-NLS-1$
            +   "<graphics>" //$NON-NLS-1$
            +       serializeWithoutHeader(pointGraphic)
            +       serializeWithoutHeader(pixelInfoGraphic)
            +       serializeWithoutHeader(annotationGraphic)
            +       serializeWithoutHeader(lineGraphic)
            +       serializeWithoutHeader(parallelLine)
            +       serializeWithoutHeader(polylineGraphic)
            +       serializeWithoutHeader(polygonGraphic)
            +       serializeWithoutHeader(rectangleGraphic)
            +       serializeWithoutHeader(angleGraphic)
            +       serializeWithoutHeader(cobbAngleGraphic)
            +   "</graphics>" //$NON-NLS-1$
            + "</presentation>", UUID_1, UUID_3, UUID_2); //$NON-NLS-1$
        
        assertThat(actual).isEqualTo(expected);
    }
    
    @Test
    public void test_with_mulitiple_graphics_and_multiple_layers() throws Exception {
        ImageElement img = mockImage(UUID_2, UUID_3);
        GraphicModel model = new XmlGraphicModel(img);
        model.setUuid(UUID_1);
        
        Graphic pointGraphic = PointGraphicTest.COMPLETE_OBJECT.copy();
        Graphic pixelInfoGraphic = PixelInfoGraphicTest.COMPLETE_OBJECT.copy();
        Graphic annotationGraphic = AnnotationGraphicTest.COMPLETE_OBJECT.copy();
        Graphic lineGraphic = LineGraphicTest.COMPLETE_OBJECT.copy();
        Graphic parallelLine = ParallelLineGraphicTest.COMPLETE_OBJECT.copy();
        Graphic polylineGraphic = PolylineGraphicTest.COMPLETE_OBJECT.copy();
        Graphic polygonGraphic = PolygonGraphicTest.COMPLETE_OBJECT.copy();
        Graphic rectangleGraphic = RectangleGraphicTest.COMPLETE_OBJECT.copy();
        Graphic angleGraphic = AngleToolGraphicTest.COMPLETE_OBJECT.copy();
        Graphic cobbAngleGraphic = CobbAngleToolGraphicTest.COMPLETE_OBJECT.copy();
        
        pixelInfoGraphic.setLayerType(LayerType.ANNOTATION);
        lineGraphic.setLayerType(LayerType.MEASURE);
        rectangleGraphic.setLayerType(LayerType.MEASURE);
        
        model.addGraphic(pointGraphic);
        model.addGraphic(pixelInfoGraphic);
        model.addGraphic(annotationGraphic);
        model.addGraphic(lineGraphic);
        model.addGraphic(parallelLine);
        model.addGraphic(polylineGraphic);
        model.addGraphic(polygonGraphic);
        model.addGraphic(rectangleGraphic);
        model.addGraphic(angleGraphic);
        model.addGraphic(cobbAngleGraphic);
        
        assertThat(model.getLayers()).hasSize(3);
        Layer layer1 = model.getLayers().get(0);
        Layer layer2 = model.getLayers().get(1);
        Layer layer3 = model.getLayers().get(2);
        
        assertThat(layer1).isNotNull();
        assertThat(layer2).isNotNull();
        assertThat(layer3).isNotNull();
        
        assertThat(pointGraphic.getLayer()).isEqualTo(layer1);
        assertThat(pixelInfoGraphic.getLayer()).isEqualTo(layer2);
        assertThat(annotationGraphic.getLayer()).isEqualTo(layer1);
        assertThat(lineGraphic.getLayer()).isEqualTo(layer3);
        assertThat(polylineGraphic.getLayer()).isEqualTo(layer1);
        assertThat(polygonGraphic.getLayer()).isEqualTo(layer1);
        assertThat(rectangleGraphic.getLayer()).isEqualTo(layer3);
        assertThat(angleGraphic.getLayer()).isEqualTo(layer1);
        assertThat(cobbAngleGraphic.getLayer()).isEqualTo(layer1);
        
        String actual = serialize(model);
        String expected = String.format(TPL_XML_PREFIX + 
            "<presentation uuid=\"%s\">" //$NON-NLS-1$
            +   "<references>" //$NON-NLS-1$
            +       "<series uuid=\"%s\">" //$NON-NLS-1$
            +           "<image frames=\"\" uuid=\"%s\"/>" //$NON-NLS-1$
            +       "</series>" //$NON-NLS-1$
            +   "</references>" //$NON-NLS-1$
            +   "<layers>" //$NON-NLS-1$
            +       serializeWithoutHeader(layer1)
            +       serializeWithoutHeader(layer2)
            +       serializeWithoutHeader(layer3)
            +   "</layers>" //$NON-NLS-1$
            +   "<graphics>" //$NON-NLS-1$
            +       serializeWithoutHeader(pointGraphic)
            +       serializeWithoutHeader(pixelInfoGraphic)
            +       serializeWithoutHeader(annotationGraphic)
            +       serializeWithoutHeader(lineGraphic)
            +       serializeWithoutHeader(parallelLine)
            +       serializeWithoutHeader(polylineGraphic)
            +       serializeWithoutHeader(polygonGraphic)
            +       serializeWithoutHeader(rectangleGraphic)
            +       serializeWithoutHeader(angleGraphic)
            +       serializeWithoutHeader(cobbAngleGraphic)
            +   "</graphics>" //$NON-NLS-1$
            + "</presentation>", UUID_1, UUID_3, UUID_2); //$NON-NLS-1$
        
        assertThat(actual).isEqualTo(expected);
        consoleDisplay(model);
    }
}
