// 
// Decompiled by Procyon v0.6.0
// 

package com.google.common.flogger.parameter;

import java.util.Collections;
import java.util.EnumMap;
import com.google.common.flogger.util.Checks;
import com.google.common.flogger.backend.FormatOptions;
import com.google.common.flogger.backend.FormatChar;
import java.util.Map;

public final class SimpleParameter extends Parameter
{
    private static final int MAX_CACHED_PARAMETERS = 10;
    private static final Map<FormatChar, SimpleParameter[]> DEFAULT_PARAMETERS;
    private final FormatChar formatChar;
    private final String formatString;
    
    private static SimpleParameter[] createParameterArray(final FormatChar formatChar) {
        final SimpleParameter[] parameters = new SimpleParameter[10];
        for (int index = 0; index < 10; ++index) {
            parameters[index] = new SimpleParameter(index, formatChar, FormatOptions.getDefault());
        }
        return parameters;
    }
    
    public static SimpleParameter of(final int index, final FormatChar formatChar, final FormatOptions options) {
        if (index < 10 && options.isDefault()) {
            return SimpleParameter.DEFAULT_PARAMETERS.get(formatChar)[index];
        }
        return new SimpleParameter(index, formatChar, options);
    }
    
    private SimpleParameter(final int index, final FormatChar formatChar, final FormatOptions options) {
        super(options, index);
        this.formatChar = Checks.checkNotNull(formatChar, "format char");
        this.formatString = (options.isDefault() ? formatChar.getDefaultFormatString() : buildFormatString(options, formatChar));
    }
    
    static String buildFormatString(final FormatOptions options, final FormatChar formatChar) {
        char c = formatChar.getChar();
        c = (options.shouldUpperCase() ? ((char)(c & 0xFFFFFFDF)) : c);
        return options.appendPrintfOptions(new StringBuilder("%")).append(c).toString();
    }
    
    @Override
    protected void accept(final ParameterVisitor visitor, final Object value) {
        visitor.visit(value, this.formatChar, this.getFormatOptions());
    }
    
    @Override
    public String getFormat() {
        return this.formatString;
    }
    
    static {
        final Map<FormatChar, SimpleParameter[]> map = new EnumMap<FormatChar, SimpleParameter[]>(FormatChar.class);
        for (final FormatChar fc : FormatChar.values()) {
            map.put(fc, createParameterArray(fc));
        }
        DEFAULT_PARAMETERS = Collections.unmodifiableMap((Map<? extends FormatChar, ? extends SimpleParameter[]>)map);
    }
}
