/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * 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.
 */

package dex.reader;

import dex.reader.DexFileReader.FieldIdItem;
import dex.structure.DexAnnotation;
import dex.structure.DexAnnotationAttribute;

import java.util.List;

// FIXME provide special type for Signature annotation
/* package */final class DexAnnotationImpl implements DexAnnotation {

    private int offset;
    private DexBuffer buffer;
    private int[] typeIds;
    private String[] stringPool;
    private Visibility visibility;
    private DexEncodedAnnotationImpl encodedAnnotation;

    private TypeFormatter formatter = new TypeFormatter();
    private final FieldIdItem[] fieldIdItems;

    public DexAnnotationImpl(DexBuffer buffer, int offset, int[] typeIds,
            String[] stringPool, FieldIdItem[] fieldIdItems) {
        this.buffer = buffer;
        this.offset = offset;
        this.typeIds = typeIds;
        this.stringPool = stringPool;
        this.fieldIdItems = fieldIdItems;
        parseAnnotations();
    }

    private void parseAnnotations() {
        buffer.setPosition(offset);
        visibility = Visibility.get(buffer.readUByte());
        encodedAnnotation = new DexEncodedAnnotationImpl(buffer, this, typeIds,
                stringPool, fieldIdItems);
    }

    public List<DexAnnotationAttribute> getAttributes() {
        return encodedAnnotation.getValue();
    }

    public String getTypeName() {
        return encodedAnnotation.getTypeName();
    }

    public Visibility getVisibility() {
        return visibility;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("@");
        builder.append(formatter.format(encodedAnnotation.getTypeName()));
        if (!getAttributes().isEmpty()) {
            builder.append(" (");
            for (DexAnnotationAttribute value : getAttributes()) {
                builder.append(value.toString());
                builder.append(" ");
            }
            builder.append(")");
        }
        return builder.toString();
    }

}