/*
 * 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.text.lookup;

import java.net.InetAddress;
import java.net.UnknownHostException;

import org.apache.commons.text.StringSubstitutor;

/**
 * Looks up keys related to DNS entries like host name, canonical host name, host address.
 * <p>
 * The lookup keys are:
 * </p>
 * <ul>
 * <li><b>name|<em>address</em></b>: for the host name, for example {@code "name|93.184.216.34"} ->
 * {@code "example.com"}.</li>
 * <li><b>canonical-name|<em>address</em></b>: for the canonical host name, for example {@code "name|93.184.216.34"} ->
 * {@code "example.com"}.</li>
 * <li><b>address|<em>hostname</em></b>: for the host address, for example {@code "address|example.com"} ->
 * {@code "93.184.216.34"}.</li>
 * <li><b><em>address</em></b>: same as {@code address|hostname}.</li>
 * </ul>
 *
 * <p>
 * Using a {@link StringLookup} from the {@link StringLookupFactory}:
 * </p>
 *
 * <pre>
 * StringLookupFactory.INSTANCE.dnsStringLookup().lookup("address|apache.org");
 * </pre>
 * <p>
 * Using a {@link StringSubstitutor}:
 * </p>
 *
 * <pre>
 * StringSubstitutor.createInterpolator().replace("... ${dns:address|apache.org} ..."));
 * </pre>
 * <p>
 * The above examples convert {@code "address|apache.org"} to {@code "95.216.24.32} (or {@code "40.79.78.1"}).
 * </p>
 *
 * @since 1.8
 */
final class DnsStringLookup extends AbstractStringLookup {

    /**
     * Defines the singleton for this class.
     */
    static final DnsStringLookup INSTANCE = new DnsStringLookup();

    /**
     * No need to build instances for now.
     */
    private DnsStringLookup() {
        // empty
    }

    /**
     * Looks up the DNS value of the key.
     *
     * @param key the key to be looked up, may be null
     * @return The DNS value.
     */
    @Override
    public String lookup(final String key) {
        if (key == null) {
            return null;
        }
        final String[] keys = key.trim().split("\\|");
        final int keyLen = keys.length;
        final String subKey = keys[0].trim();
        final String subValue = keyLen < 2 ? key : keys[1].trim();
        try {
            final InetAddress inetAddress = InetAddress.getByName(subValue);
            switch (subKey) {
            case InetAddressKeys.KEY_NAME:
                return inetAddress.getHostName();
            case InetAddressKeys.KEY_CANONICAL_NAME:
                return inetAddress.getCanonicalHostName();
            case InetAddressKeys.KEY_ADDRESS:
                return inetAddress.getHostAddress();
            default:
                return inetAddress.getHostAddress();
            }
        } catch (final UnknownHostException e) {
            return null;
        }
    }

}
