/*
 * 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.
 */

/* $Id$ */

package org.apache.fop.afp;

import org.apache.fop.afp.modca.Registry;
import org.apache.fop.afp.modca.triplets.MappingOptionTriplet;

/**
 * A list of parameters associated with an AFP data objects
 */
public class AFPDataObjectInfo {

    /** the object area info */
    private AFPObjectAreaInfo objectAreaInfo;

    /** resource info */
    private AFPResourceInfo resourceInfo;

    /** the data object width */
    private int dataWidth;

    /** the data object height */
    private int dataHeight;

    /** the object registry mimetype */
    private String mimeType;

    /** the object data in a byte array */
    private byte[] data;

    private byte[] transparencyMask;

    /** the object data height resolution */
    private int dataHeightRes;

    /** the object data width resolution */
    private int dataWidthRes;

    /** controls whether to create a page segment or a simple object */
    private boolean createPageSegment;

    /** controls the mapping of the image data into the image area */
    private byte mappingOption = MappingOptionTriplet.SCALE_TO_FILL;

    public static final byte DEFAULT_MAPPING_OPTION = 0x00;

    /**
     * Default constructor
     */
    public AFPDataObjectInfo() {
    }

    /**
     * Sets the image mime type
     *
     * @param mimeType the image mime type
     */
    public void setMimeType(String mimeType) {
        this.mimeType = mimeType;
    }

    /**
     * Returns the mime type of this data object
     *
     * @return the mime type of this data object
     */
    public String getMimeType() {
        return mimeType;
    }

    /**
     * Convenience method to return the object type
     *
     * @return the object type
     */
    public Registry.ObjectType getObjectType() {
        return Registry.getInstance().getObjectType(getMimeType());
    }

    /**
     * Returns the resource level at which this data object should reside
     *
     * @return the resource level at which this data object should reside
     */
    public AFPResourceInfo getResourceInfo() {
        if (resourceInfo == null) {
            this.resourceInfo = new AFPResourceInfo();
        }
        return resourceInfo;
    }

    /**
     * Sets the resource level at which this object should reside
     *
     * @param resourceInfo the resource level at which this data object should reside
     */
    public void setResourceInfo(AFPResourceInfo resourceInfo) {
        this.resourceInfo = resourceInfo;
    }

    /**
     * Sets the object area info
     *
     * @param objectAreaInfo the object area info
     */
    public void setObjectAreaInfo(AFPObjectAreaInfo objectAreaInfo) {
        this.objectAreaInfo = objectAreaInfo;
    }

    /**
     * Returns the object area info
     *
     * @return the object area info
     */
    public AFPObjectAreaInfo getObjectAreaInfo() {
        return this.objectAreaInfo;
    }

    /**
     * Returns the uri of this data object
     *
     * @return the uri of this data object
     */
    public String getUri() {
        return getResourceInfo().getUri();
    }

    /**
     * Sets the data object uri
     *
     * @param uri the data object uri
     */
    public void setUri(String uri) {
        getResourceInfo().setUri(uri);
    }

    /**
     * Returns the image data width
     *
     * @return the image data width
     */
    public int getDataWidth() {
        return dataWidth;
    }

    /**
     * Sets the image data width
     *
     * @param imageDataWidth the image data width
     */
    public void setDataWidth(int imageDataWidth) {
        this.dataWidth = imageDataWidth;
    }

    /**
     * Returns the image data height
     *
     * @return the image data height
     */
    public int getDataHeight() {
        return dataHeight;
    }

    /**
     * Sets the image data height
     *
     * @param imageDataHeight the image data height
     */
    public void setDataHeight(int imageDataHeight) {
        this.dataHeight = imageDataHeight;
    }

    /**
     * Returns the data height resolution
     *
     * @return the data height resolution
     */
    public int getDataHeightRes() {
        return this.dataHeightRes;
    }

    /**
     * Sets the data height resolution
     *
     * @param dataHeightRes the data height resolution
     */
    public void setDataHeightRes(int dataHeightRes) {
        this.dataHeightRes = dataHeightRes;
    }

    /**
     * Returns the data width resolution
     *
     * @return the data width resolution
     */
    public int getDataWidthRes() {
        return this.dataWidthRes;
    }

    /**
     * Sets the data width resolution
     *
     * @param dataWidthRes the data width resolution
     */
    public void setDataWidthRes(int dataWidthRes) {
        this.dataWidthRes = dataWidthRes;
    }

    /**
     * Sets the object data
     *
     * @param data the object data
     */
    public void setData(byte[] data) {
        this.data = data;
    }

    /**
     * Returns the object data
     *
     * @return the object data
     */
    public byte[] getData() {
        return this.data;
    }

    public void setTransparencyMask(byte[] transparencyMask) {
        this.transparencyMask = transparencyMask;
    }

    public byte[] getTransparencyMask() {
        return transparencyMask;
    }

    /**
     * Controls whether to create a page segment or a normal object.
     * @param value true for page segments, false for objects
     */
    public void setCreatePageSegment(boolean value) {
        this.createPageSegment = value;
    }

    /**
     * Indicates whether a page segment or a normal object shall be created.
     * @return true for page segments, false for objects
     */
    public boolean isCreatePageSegment() {
        return this.createPageSegment;
    }

    /**
     * Sets the way an image is mapped into its target area.
     * @param mappingOption the mapping option (Valid values: see Mapping Option Triplet)
     */
    public void setMappingOption(byte mappingOption) {
        this.mappingOption = mappingOption;
    }

    /**
     * Returns the way an image is mapped into its target area. By default, this is "scale to fill"
     * behavior.
     * @return the mapping option value from the Mapping Option Triplet
     */
    public byte getMappingOption() {
        return mappingOption;
    }

    /** {@inheritDoc} */
    public String toString() {
        return "AFPDataObjectInfo{"
            + "mimeType=" + mimeType
            + ", dataWidth=" + dataWidth
            + ", dataHeight=" + dataHeight
            + ", dataWidthRes=" + dataWidthRes
            + ", dataHeightRes=" + dataHeightRes
            + (objectAreaInfo != null ? ", objectAreaInfo=" + objectAreaInfo : "")
            + (resourceInfo != null ? ", resourceInfo=" + resourceInfo : "");
    }

}
