package org.onebillion.onecourse.utils;

import android.graphics.Matrix;
import android.graphics.Path;
import android.graphics.PointF;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by alan on 06/02/16.
 */
public class UPath
{
    public List<USubPath> subPaths;
    float length;

    public UPath()
    {
        length = -1;
        subPaths = new ArrayList<>();
    }

    public float length()
    {
        if (length < 0)
            calcLength();
        return length;
    }

    public void calcLength()
    {
        length = 0;
        for (USubPath sp : subPaths)
            length += sp.length();
    }

    public Path bezierPath()
    {
        Path bez = new Path();
        for (USubPath sp : subPaths)
            bez.addPath(sp.bezierPath());
        return bez;
    }

    public void transformByMatrix(Matrix t)
    {
        for (USubPath usp : subPaths)
            usp.transformByMatrix(t);
    }

    public USubPath convexHull()
    {
        List<PointF>points = new ArrayList<>();
        for(USubPath usp : subPaths )
        {
            if(usp.elements.size()  > 0)
            {
                ULine ulx = usp.elements.get(0);
                points.add(ulx.pt0);
                for(ULine ul : usp.elements)
                {
                    points.add(ul.pt1);
                    if(ul instanceof UCurve)
                    {
                        UCurve uc =(UCurve)ul;
                        if(!(uc.cp0.equals(ul.pt0)))
                            points.add(uc.cp0);
                        if(!(uc.cp1.equals(ul.pt1)))
                            points.add(uc.cp1);
                    }
                }
            }
        }
        List<PointF> hull = OBUtils.convexHullFromPoints(points);
        return USubPath.uSubPathFromPoints(hull);
    }

}