/**
 *  Phonetic
 *  Copyright 201 by Michael Peter Christen, mc@yacy.net, Frankfurt a. M., Germany
 *  First released 13.12.2011 at https://yacy.net
 *
 *  $LastChangedDate$
 *  $LastChangedRevision$
 *  $LastChangedBy$
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with this program in the file lgpl21.txt
 *  If not, see <http://www.gnu.org/licenses/>.
 */

package net.yacy.cora.language.phonetic;

public class Phonetic {

    public enum Encoder {
        SOUNDEX("Soundex", ""),
        COLONE_PHONETIC("Koelner Phonetik", "http://de.wikipedia.org/wiki/K%C3%B6lner_Phonetik"),
        METAPHONE("Metaphone", ""),
        DOUBLE_METAPHONE("Double Metaphone", ""),
        NONE("", "");
        
        final String printName;
        final String infoUrl;
        
        private Encoder(final String printName, final String infoUrl) {
            this.printName = printName;
            this.infoUrl = infoUrl;
        }
    }
    
    private static final Soundex soundexEncoder = new Soundex();
    private static final Metaphone metaphoneEncoder = new Metaphone();
    private static final DoubleMetaphone doubleMetaphoneEncoder = new DoubleMetaphone();
    private static final ColognePhonetic colognePhonetic = new ColognePhonetic();
    
    public static String encode(final Encoder encoder, final String s) {
        try {
            if (encoder == Encoder.SOUNDEX) return soundexEncoder.encode(s);
            if (encoder == Encoder.COLONE_PHONETIC) return colognePhonetic.encode(s);
            if (encoder == Encoder.METAPHONE) return metaphoneEncoder.encode(s);
            if (encoder == Encoder.DOUBLE_METAPHONE) return doubleMetaphoneEncoder.encode(s);
            return s;
        } catch (final Throwable e) {
            // some encoders do not work with non-ASCII charachters and throw an exception
            return s;
        }
    }
    
    public static void main(String[] args) {
        for (Encoder encoder: Encoder.values()) {
            for (String s: args) {
                System.out.print(Phonetic.encode(encoder, s));
                System.out.print(" ");
            }
            System.out.println();
        }
    }
    
}
