using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Annulus.CSG.StraightSkeletonUtilities;
using Annulus.CSG;
using Azimuth;

namespace Annulus.UnitTests
{
    public class BuildSVGTests : UnitTestSharp.TestFixture
    {
        public void Basic()
        {
            var Vertices = new List<StraightSkeleton.ExportVertex>
            {
                new StraightSkeleton.ExportVertex
                {
                    Position = new Vector(-1, 1),
                    Edges = new List<StraightSkeleton.ExportEdge>(),
                },

                new StraightSkeleton.ExportVertex
                {
                    Position = new Vector( 1, 1),
                    Edges = new List<StraightSkeleton.ExportEdge>(),
                },

                new StraightSkeleton.ExportVertex
                {
                    Position = new Vector( 1,-1),
                    Edges = new List<StraightSkeleton.ExportEdge>(),
                },

                new StraightSkeleton.ExportVertex
                {
                    Position = new Vector(-1,-1),
                    Edges = new List<StraightSkeleton.ExportEdge>(),
                },
            };

            var straightSkeleton = new StraightSkeleton
            {
                Edges = new List<StraightSkeleton.ExportEdge>
                {
                    new StraightSkeleton.ExportEdge
                    {
                        Vertices = Vertices,
                        Vertex1Index = 0,
                        Vertex2Index = 1,
                    },

                    new StraightSkeleton.ExportEdge
                    {
                        Vertices = Vertices,
                        Vertex1Index = 1,
                        Vertex2Index = 2,
                    },

                    new StraightSkeleton.ExportEdge
                    {
                        Vertices = Vertices,
                        Vertex1Index = 2,
                        Vertex2Index = 3,
                    },

                    new StraightSkeleton.ExportEdge
                    {
                        Vertices = Vertices,
                        Vertex1Index = 3,
                        Vertex2Index = 0,
                    },
                },

                Vertices = Vertices,
            };

            straightSkeleton.Edges.ForEach(edge =>
            {
                edge.Vertex1.Edges.Add(edge);
                edge.Vertex2.Edges.Add(edge);
            });

            var expected =
@"<path d = ""
M -1 1 L 1 1 
M 1 1 L 1 -1 
M 1 -1 L -1 -1 
M -1 -1 L -1 1 
"" STYLE2 />
<g class='non-scaling'>
<circle transform='translate(-1,1)' r = '1.5' STYLE1 />
<circle transform='translate(1,1)' r = '1.5' STYLE1 />
<circle transform='translate(1,-1)' r = '1.5' STYLE1 />
<circle transform='translate(-1,-1)' r = '1.5' STYLE1 />
<text transform='translate(0,1)' font-size='20' xml:space='preserve' dy='-.25em' dx='.25em' STYLE4 >0</text>
<text transform='translate(1,0)' font-size='20' xml:space='preserve' dy='-.25em' dx='.25em' STYLE4 >1</text>
<text transform='translate(0,-1)' font-size='20' xml:space='preserve' dy='-.25em' dx='.25em' STYLE4 >2</text>
<text transform='translate(-1,0)' font-size='20' xml:space='preserve' dy='-.25em' dx='.25em' STYLE4 >3</text>
<text transform='translate(-1,1)' font-size='20' xml:space='preserve' dy='-.25em' dx='.25em' STYLE3 >0</text>
<text transform='translate(1,1)' font-size='20' xml:space='preserve' dy='-.25em' dx='.25em' STYLE3 >1</text>
<text transform='translate(1,-1)' font-size='20' xml:space='preserve' dy='-.25em' dx='.25em' STYLE3 >2</text>
<text transform='translate(-1,-1)' font-size='20' xml:space='preserve' dy='-.25em' dx='.25em' STYLE3 >3</text>
</g>
";

            var actual = straightSkeleton.BuildSVG("STYLE1", "STYLE2", "STYLE3", "STYLE4");

            CheckEqual(expected, actual);
        }
    }
}