/* ====================================================================
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
==================================================================== */

package org.apache.poi.xslf.draw.geom;

import java.awt.geom.Path2D;

import org.apache.poi.sl.draw.geom.ClosePathCommand;
import org.apache.poi.sl.draw.geom.Context;
import org.apache.poi.sl.draw.geom.PathCommand;
import org.apache.poi.sl.draw.geom.PathIf;
import org.apache.poi.sl.usermodel.PaintStyle;
import org.apache.poi.util.Beta;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlObject;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2D;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DArcTo;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DClose;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DCubicBezierTo;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DLineTo;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DMoveTo;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DQuadBezierTo;
import org.openxmlformats.schemas.drawingml.x2006.main.STPathFillMode;

/**
 * Wrapper / delegate for XmlBeans custom geometry
 */
@Beta
public class XSLFPath implements PathIf {

    private final CTPath2D pathXml;

    public XSLFPath(CTPath2D pathXml) {
        this.pathXml = pathXml;
    }

    @Override
    public void addCommand(PathCommand cmd) {
        // not supported
    }

    @Override
    public Path2D.Double getPath(Context ctx) {
        Path2D.Double path2D = new Path2D.Double();
        XmlCursor cur = pathXml.newCursor();
        try {
            for (boolean hasNext = cur.toFirstChild(); hasNext; hasNext = cur.toNextSibling()) {
                XmlObject xo = cur.getObject();
                PathCommand pc;
                if (xo instanceof CTPath2DArcTo) {
                    pc = new XSLFArcTo((CTPath2DArcTo) xo);
                } else if (xo instanceof CTPath2DCubicBezierTo) {
                    pc = new XSLFCurveTo((CTPath2DCubicBezierTo) xo);
                } else if (xo instanceof CTPath2DMoveTo) {
                    pc = new XSLFMoveTo((CTPath2DMoveTo) xo);
                } else if (xo instanceof CTPath2DLineTo) {
                    pc = new XSLFLineTo((CTPath2DLineTo) xo);
                } else if (xo instanceof CTPath2DQuadBezierTo) {
                    pc = new XSLFQuadTo((CTPath2DQuadBezierTo) xo);
                } else if (xo instanceof CTPath2DClose) {
                    pc = new ClosePathCommand();
                } else {
                    continue;
                }
                pc.execute(path2D, ctx);
            }
        } finally {
            cur.dispose();
        }
        return path2D;
    }

    @Override
    public boolean isStroked() {
        return pathXml.getStroke();
    }

    @Override
    public void setStroke(boolean stroke) {
        pathXml.setStroke(stroke);
    }

    @Override
    public boolean isFilled() {
        return pathXml.getFill() != STPathFillMode.NONE;
    }

    @Override
    public PaintStyle.PaintModifier getFill() {
        switch (pathXml.getFill().intValue()) {
            default:
            case STPathFillMode.INT_NONE:
                return PaintStyle.PaintModifier.NONE;
            case STPathFillMode.INT_NORM:
                return PaintStyle.PaintModifier.NORM;
            case STPathFillMode.INT_LIGHTEN:
                return PaintStyle.PaintModifier.LIGHTEN;
            case STPathFillMode.INT_LIGHTEN_LESS:
                return PaintStyle.PaintModifier.LIGHTEN_LESS;
            case STPathFillMode.INT_DARKEN:
                return PaintStyle.PaintModifier.DARKEN;
            case STPathFillMode.INT_DARKEN_LESS:
                return PaintStyle.PaintModifier.DARKEN_LESS;
        }
    }

    @Override
    public void setFill(PaintStyle.PaintModifier fill) {
        STPathFillMode.Enum f;
        switch (fill) {
            default:
            case NONE:
                f = STPathFillMode.NONE;
                break;
            case NORM:
                f = STPathFillMode.NORM;
                break;
            case LIGHTEN:
                f = STPathFillMode.LIGHTEN;
                break;
            case LIGHTEN_LESS:
                f = STPathFillMode.LIGHTEN_LESS;
                break;
            case DARKEN:
                f = STPathFillMode.DARKEN;
                break;
            case DARKEN_LESS:
                f = STPathFillMode.DARKEN_LESS;
                break;
        }
        pathXml.setFill(f);
    }

    @Override
    public long getW() {
        return pathXml.getW();
    }

    @Override
    public void setW(long w) {
        pathXml.setW(w);
    }

    @Override
    public long getH() {
        return pathXml.getH();
    }

    @Override
    public void setH(long h) {
        pathXml.setH(h);
    }

    @Override
    public boolean isExtrusionOk() {
        return pathXml.getExtrusionOk();
    }

    @Override
    public void setExtrusionOk(boolean extrusionOk) {
        pathXml.setExtrusionOk(extrusionOk);
    }

}
