// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org)

package org.xbill.DNS;

/**
 * Constants and functions relating to DNS message sections
 *
 * @author Brian Wellington
 */

public final class Section {

    /**
     * The question (first) section
     */
    public static final int QUESTION = 0;

    /**
     * The answer (second) section
     */
    public static final int ANSWER = 1;

    /**
     * The authority (third) section
     */
    public static final int AUTHORITY = 2;

    /**
     * The additional (fourth) section
     */
    public static final int ADDITIONAL = 3;

/* Aliases for dynamic update */
    /**
     * The zone (first) section of a dynamic update message
     */
    public static final int ZONE = 0;

    /**
     * The prerequisite (second) section of a dynamic update message
     */
    public static final int PREREQ = 1;

    /**
     * The update (third) section of a dynamic update message
     */
    public static final int UPDATE = 2;

    private static Mnemonic sections = new Mnemonic("Message Section",
            Mnemonic.CASE_LOWER);
    private static String[] longSections = new String[4];
    private static String[] updateSections = new String[4];

    static {
        sections.setMaximum(3);
        sections.setNumericAllowed(true);

        sections.add(QUESTION, "qd");
        sections.add(ANSWER, "an");
        sections.add(AUTHORITY, "au");
        sections.add(ADDITIONAL, "ad");

        longSections[QUESTION] = "QUESTIONS";
        longSections[ANSWER] = "ANSWERS";
        longSections[AUTHORITY] = "AUTHORITY RECORDS";
        longSections[ADDITIONAL] = "ADDITIONAL RECORDS";

        updateSections[ZONE] = "ZONE";
        updateSections[PREREQ] = "PREREQUISITES";
        updateSections[UPDATE] = "UPDATE RECORDS";
        updateSections[ADDITIONAL] = "ADDITIONAL RECORDS";
    }

    private Section() {
    }

    /**
     * Converts a numeric Section into an abbreviation String
     */
    public static String
    string(int i) {
        return sections.getText(i);
    }

    /**
     * Converts a numeric Section into a full description String
     */
    public static String
    longString(int i) {
        sections.check(i);
        return longSections[i];
    }

    /**
     * Converts a numeric Section into a full description String for an update
     * Message.
     */
    public static String
    updString(int i) {
        sections.check(i);
        return updateSections[i];
    }

    /**
     * Converts a String representation of a Section into its numeric value
     */
    public static int
    value(String s) {
        return sections.getValue(s);
    }

}
