/*
 * 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.commons.imaging.formats.tiff.constants;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.apache.commons.imaging.SanselanConstants;
import org.apache.commons.imaging.formats.tiff.fieldtypes.FieldType;
import org.apache.commons.imaging.formats.tiff.fieldtypes.FieldTypeAscii;
import org.apache.commons.imaging.formats.tiff.fieldtypes.FieldTypeByte;
import org.apache.commons.imaging.formats.tiff.fieldtypes.FieldTypeDouble;
import org.apache.commons.imaging.formats.tiff.fieldtypes.FieldTypeFloat;
import org.apache.commons.imaging.formats.tiff.fieldtypes.FieldTypeLong;
import org.apache.commons.imaging.formats.tiff.fieldtypes.FieldTypeRational;
import org.apache.commons.imaging.formats.tiff.fieldtypes.FieldTypeShort;
import org.apache.commons.imaging.formats.tiff.fieldtypes.FieldTypeUnknown;

public interface TiffFieldTypeConstants extends SanselanConstants
{

    public static final FieldTypeByte FIELD_TYPE_BYTE = new FieldTypeByte(1,
            "Byte");

    public static final FieldTypeAscii FIELD_TYPE_ASCII = new FieldTypeAscii(2,
            "ASCII");

    public static final FieldTypeShort FIELD_TYPE_SHORT = new FieldTypeShort(3,
            "Short");

    public static final FieldTypeLong FIELD_TYPE_LONG = new FieldTypeLong(4,
            "Long");

    public static final FieldTypeRational FIELD_TYPE_RATIONAL = new FieldTypeRational(
            5, "Rational");

    public static final FieldType FIELD_TYPE_SBYTE = new FieldTypeByte(6,
            "SByte");
    public static final FieldType FIELD_TYPE_UNDEFINED = new FieldTypeByte(7,
            "Undefined");
    public static final FieldType FIELD_TYPE_SSHORT = new FieldTypeShort(8,
            "SShort");

    public static final FieldType FIELD_TYPE_SLONG = new FieldTypeLong(9,
            "SLong");

    public static final FieldType FIELD_TYPE_SRATIONAL = new FieldTypeRational(
            10, "SRational");

    public static final FieldType FIELD_TYPE_FLOAT = new FieldTypeFloat();

    public static final FieldType FIELD_TYPE_DOUBLE = new FieldTypeDouble();

    public static final FieldType FIELD_TYPE_UNKNOWN = new FieldTypeUnknown();

    public static final List<FieldType> FIELD_TYPES =
            Collections.unmodifiableList(Arrays.asList(
                    FIELD_TYPE_BYTE, FIELD_TYPE_ASCII, FIELD_TYPE_SHORT,
                    FIELD_TYPE_LONG, FIELD_TYPE_RATIONAL, FIELD_TYPE_SBYTE,
                    FIELD_TYPE_UNDEFINED, FIELD_TYPE_SSHORT, FIELD_TYPE_SLONG,
                    FIELD_TYPE_SRATIONAL, FIELD_TYPE_FLOAT, FIELD_TYPE_DOUBLE));

    public static final List<FieldType> FIELD_TYPE_ANY = FIELD_TYPES;

    public static final List<FieldType> FIELD_TYPE_DESCRIPTION_SHORT_OR_LONG =
            Collections.unmodifiableList(Arrays.asList(
                    FIELD_TYPE_SHORT, FIELD_TYPE_LONG));
    
    public static final List<FieldType> FIELD_TYPE_DESCRIPTION_SHORT_OR_RATIONAL =
            Collections.unmodifiableList(Arrays.asList(
                    FIELD_TYPE_SHORT, FIELD_TYPE_RATIONAL));
    
    public static final List<FieldType> FIELD_TYPE_DESCRIPTION_SHORT_OR_LONG_OR_RATIONAL =
            Collections.unmodifiableList(Arrays.asList(
                    FIELD_TYPE_SHORT, FIELD_TYPE_LONG, FIELD_TYPE_RATIONAL));
    
    public static final List<FieldType> FIELD_TYPE_DESCRIPTION_LONG_OR_SHORT =
            Collections.unmodifiableList(Arrays.asList(
                    FIELD_TYPE_SHORT, FIELD_TYPE_LONG));
    
    public static final List<FieldType> FIELD_TYPE_DESCRIPTION_BYTE_OR_SHORT =
            Collections.unmodifiableList(Arrays.asList(
                    FIELD_TYPE_SHORT, FIELD_TYPE_BYTE));
    
    public static final List<FieldType> FIELD_TYPE_DESCRIPTION_ASCII_OR_RATIONAL =
            Collections.unmodifiableList(Arrays.asList(
                    FIELD_TYPE_ASCII, FIELD_TYPE_RATIONAL));
    
    public static final List<FieldType> FIELD_TYPE_DESCRIPTION_ASCII_OR_BYTE =
            Collections.unmodifiableList(Arrays.asList(
                    FIELD_TYPE_ASCII, FIELD_TYPE_BYTE));
}