/*
 * Copyright 2002-2019 Drew Noakes and contributors
 *
 *    Licensed 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.
 *
 * More information about this project is available at:
 *
 *    https://drewnoakes.com/code/exif/
 *    https://github.com/drewnoakes/metadata-extractor
 */
package com.drew.metadata.icc;

import com.drew.lang.annotations.NotNull;
import com.drew.metadata.Directory;

import java.util.HashMap;

/**
 * @author Yuri Binev
 * @author Drew Noakes https://drewnoakes.com
 */
@SuppressWarnings("WeakerAccess")
public class IccDirectory extends Directory
{
    // These (smaller valued) tags have an integer value that's equal to their offset within the ICC data buffer.

    public static final int TAG_PROFILE_BYTE_COUNT = 0;
    public static final int TAG_CMM_TYPE = 4;
    public static final int TAG_PROFILE_VERSION = 8;
    public static final int TAG_PROFILE_CLASS = 12;
    public static final int TAG_COLOR_SPACE = 16;
    public static final int TAG_PROFILE_CONNECTION_SPACE = 20;
    public static final int TAG_PROFILE_DATETIME = 24;
    public static final int TAG_SIGNATURE = 36;
    public static final int TAG_PLATFORM = 40;
    public static final int TAG_CMM_FLAGS = 44;
    public static final int TAG_DEVICE_MAKE = 48;
    public static final int TAG_DEVICE_MODEL = 52;
    public static final int TAG_DEVICE_ATTR = 56;
    public static final int TAG_RENDERING_INTENT = 64;
    public static final int TAG_XYZ_VALUES = 68;
    public static final int TAG_PROFILE_CREATOR = 80;
    public static final int TAG_TAG_COUNT = 128;

    // These tag values

    public static final int TAG_TAG_A2B0 = 0x41324230;
    public static final int TAG_TAG_A2B1 = 0x41324231;
    public static final int TAG_TAG_A2B2 = 0x41324232;
    public static final int TAG_TAG_bXYZ = 0x6258595A;
    public static final int TAG_TAG_bTRC = 0x62545243;
    public static final int TAG_TAG_B2A0 = 0x42324130;
    public static final int TAG_TAG_B2A1 = 0x42324131;
    public static final int TAG_TAG_B2A2 = 0x42324132;
    public static final int TAG_TAG_calt = 0x63616C74;
    public static final int TAG_TAG_targ = 0x74617267;
    public static final int TAG_TAG_chad = 0x63686164;
    public static final int TAG_TAG_chrm = 0x6368726D;
    public static final int TAG_TAG_cprt = 0x63707274;
    public static final int TAG_TAG_crdi = 0x63726469;
    public static final int TAG_TAG_dmnd = 0x646D6E64;
    public static final int TAG_TAG_dmdd = 0x646D6464;
    public static final int TAG_TAG_devs = 0x64657673;
    public static final int TAG_TAG_gamt = 0x67616D74;
    public static final int TAG_TAG_kTRC = 0x6B545243;
    public static final int TAG_TAG_gXYZ = 0x6758595A;
    public static final int TAG_TAG_gTRC = 0x67545243;
    public static final int TAG_TAG_lumi = 0x6C756D69;
    public static final int TAG_TAG_meas = 0x6D656173;
    public static final int TAG_TAG_bkpt = 0x626B7074;
    public static final int TAG_TAG_wtpt = 0x77747074;
    public static final int TAG_TAG_ncol = 0x6E636F6C;
    public static final int TAG_TAG_ncl2 = 0x6E636C32;
    public static final int TAG_TAG_resp = 0x72657370;
    public static final int TAG_TAG_pre0 = 0x70726530;
    public static final int TAG_TAG_pre1 = 0x70726531;
    public static final int TAG_TAG_pre2 = 0x70726532;
    public static final int TAG_TAG_desc = 0x64657363;
    public static final int TAG_TAG_pseq = 0x70736571;
    public static final int TAG_TAG_psd0 = 0x70736430;
    public static final int TAG_TAG_psd1 = 0x70736431;
    public static final int TAG_TAG_psd2 = 0x70736432;
    public static final int TAG_TAG_psd3 = 0x70736433;
    public static final int TAG_TAG_ps2s = 0x70733273;
    public static final int TAG_TAG_ps2i = 0x70733269;
    public static final int TAG_TAG_rXYZ = 0x7258595A;
    public static final int TAG_TAG_rTRC = 0x72545243;
    public static final int TAG_TAG_scrd = 0x73637264;
    public static final int TAG_TAG_scrn = 0x7363726E;
    public static final int TAG_TAG_tech = 0x74656368;
    public static final int TAG_TAG_bfd = 0x62666420;
    public static final int TAG_TAG_vued = 0x76756564;
    public static final int TAG_TAG_view = 0x76696577;

    public static final int TAG_TAG_aabg = 0x61616267;
    public static final int TAG_TAG_aagg = 0x61616767;
    public static final int TAG_TAG_aarg = 0x61617267;
    public static final int TAG_TAG_mmod = 0x6D6D6F64;
    public static final int TAG_TAG_ndin = 0x6E64696E;
    public static final int TAG_TAG_vcgt = 0x76636774;
    public static final int TAG_APPLE_MULTI_LANGUAGE_PROFILE_NAME = 0x6473636d;

    @NotNull
    private static final HashMap<Integer, String> _tagNameMap = new HashMap<Integer, String>();

    static {
        _tagNameMap.put(TAG_PROFILE_BYTE_COUNT, "Profile Size");
        _tagNameMap.put(TAG_CMM_TYPE, "CMM Type");
        _tagNameMap.put(TAG_PROFILE_VERSION, "Version");
        _tagNameMap.put(TAG_PROFILE_CLASS, "Class");
        _tagNameMap.put(TAG_COLOR_SPACE, "Color space");
        _tagNameMap.put(TAG_PROFILE_CONNECTION_SPACE, "Profile Connection Space");
        _tagNameMap.put(TAG_PROFILE_DATETIME, "Profile Date/Time");
        _tagNameMap.put(TAG_SIGNATURE, "Signature");
        _tagNameMap.put(TAG_PLATFORM, "Primary Platform");
        _tagNameMap.put(TAG_CMM_FLAGS, "CMM Flags");
        _tagNameMap.put(TAG_DEVICE_MAKE, "Device manufacturer");
        _tagNameMap.put(TAG_DEVICE_MODEL, "Device model");
        _tagNameMap.put(TAG_DEVICE_ATTR, "Device attributes");
        _tagNameMap.put(TAG_RENDERING_INTENT, "Rendering Intent");
        _tagNameMap.put(TAG_XYZ_VALUES, "XYZ values");
        _tagNameMap.put(TAG_PROFILE_CREATOR, "Profile Creator");
        _tagNameMap.put(TAG_TAG_COUNT, "Tag Count");
        _tagNameMap.put(TAG_TAG_A2B0, "AToB 0");
        _tagNameMap.put(TAG_TAG_A2B1, "AToB 1");
        _tagNameMap.put(TAG_TAG_A2B2, "AToB 2");
        _tagNameMap.put(TAG_TAG_bXYZ, "Blue Colorant");
        _tagNameMap.put(TAG_TAG_bTRC, "Blue TRC");
        _tagNameMap.put(TAG_TAG_B2A0, "BToA 0");
        _tagNameMap.put(TAG_TAG_B2A1, "BToA 1");
        _tagNameMap.put(TAG_TAG_B2A2, "BToA 2");
        _tagNameMap.put(TAG_TAG_calt, "Calibration Date/Time");
        _tagNameMap.put(TAG_TAG_targ, "Char Target");
        _tagNameMap.put(TAG_TAG_chad, "Chromatic Adaptation");
        _tagNameMap.put(TAG_TAG_chrm, "Chromaticity");
        _tagNameMap.put(TAG_TAG_cprt, "Profile Copyright");
        _tagNameMap.put(TAG_TAG_crdi, "CrdInfo");
        _tagNameMap.put(TAG_TAG_dmnd, "Device Mfg Description");
        _tagNameMap.put(TAG_TAG_dmdd, "Device Model Description");
        _tagNameMap.put(TAG_TAG_devs, "Device Settings");
        _tagNameMap.put(TAG_TAG_gamt, "Gamut");
        _tagNameMap.put(TAG_TAG_kTRC, "Gray TRC");
        _tagNameMap.put(TAG_TAG_gXYZ, "Green Colorant");
        _tagNameMap.put(TAG_TAG_gTRC, "Green TRC");
        _tagNameMap.put(TAG_TAG_lumi, "Luminance");
        _tagNameMap.put(TAG_TAG_meas, "Measurement");
        _tagNameMap.put(TAG_TAG_bkpt, "Media Black Point");
        _tagNameMap.put(TAG_TAG_wtpt, "Media White Point");
        _tagNameMap.put(TAG_TAG_ncol, "Named Color");
        _tagNameMap.put(TAG_TAG_ncl2, "Named Color 2");
        _tagNameMap.put(TAG_TAG_resp, "Output Response");
        _tagNameMap.put(TAG_TAG_pre0, "Preview 0");
        _tagNameMap.put(TAG_TAG_pre1, "Preview 1");
        _tagNameMap.put(TAG_TAG_pre2, "Preview 2");
        _tagNameMap.put(TAG_TAG_desc, "Profile Description");
        _tagNameMap.put(TAG_TAG_pseq, "Profile Sequence Description");
        _tagNameMap.put(TAG_TAG_psd0, "Ps2 CRD 0");
        _tagNameMap.put(TAG_TAG_psd1, "Ps2 CRD 1");
        _tagNameMap.put(TAG_TAG_psd2, "Ps2 CRD 2");
        _tagNameMap.put(TAG_TAG_psd3, "Ps2 CRD 3");
        _tagNameMap.put(TAG_TAG_ps2s, "Ps2 CSA");
        _tagNameMap.put(TAG_TAG_ps2i, "Ps2 Rendering Intent");
        _tagNameMap.put(TAG_TAG_rXYZ, "Red Colorant");
        _tagNameMap.put(TAG_TAG_rTRC, "Red TRC");
        _tagNameMap.put(TAG_TAG_scrd, "Screening Desc");
        _tagNameMap.put(TAG_TAG_scrn, "Screening");
        _tagNameMap.put(TAG_TAG_tech, "Technology");
        _tagNameMap.put(TAG_TAG_bfd, "Ucrbg");
        _tagNameMap.put(TAG_TAG_vued, "Viewing Conditions Description");
        _tagNameMap.put(TAG_TAG_view, "Viewing Conditions");
        _tagNameMap.put(TAG_TAG_aabg, "Blue Parametric TRC");
        _tagNameMap.put(TAG_TAG_aagg, "Green Parametric TRC");
        _tagNameMap.put(TAG_TAG_aarg, "Red Parametric TRC");
        _tagNameMap.put(TAG_TAG_mmod, "Make And Model");
        _tagNameMap.put(TAG_TAG_ndin, "Native Display Information");
        _tagNameMap.put(TAG_TAG_vcgt, "Video Card Gamma");
        _tagNameMap.put(TAG_APPLE_MULTI_LANGUAGE_PROFILE_NAME, "Apple Multi-language Profile Name");
    }

    public IccDirectory()
    {
        this.setDescriptor(new IccDescriptor(this));
    }

    @Override
    @NotNull
    public String getName()
    {
        return "ICC Profile";
    }

    @Override
    @NotNull
    protected HashMap<Integer, String> getTagNameMap()
    {
        return _tagNameMap;
    }
}
