/**
 *  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.synapse.transport.nhttp.debug;

import org.apache.http.Header;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 *
 */
public abstract class AbstractConnectionDebug {

    protected String keyValueSeparator;
    protected String fieldSeparator;
    protected String statementSeparator;
    protected boolean printAllHeaders;
    protected boolean printNoHeaders;
    protected List<String> printHeaderNames;

    protected Header[] headers;

    protected AbstractConnectionDebug() {
        NhttpConnectionDebugConfig connDebugConfig = NhttpConnectionDebugConfig.getInstance();
        this.keyValueSeparator = connDebugConfig.getKeyValueSeparator();
        this.fieldSeparator = connDebugConfig.getFieldSeparator();
        this.statementSeparator = connDebugConfig.getStatementSeparator();
        if (connDebugConfig.isNoHeaders()) {
            this.printNoHeaders = true;
        } else if (connDebugConfig.isAllHeaders()) {
            this.printAllHeaders = true;
        } else {
            this.printHeaderNames = connDebugConfig.getHeaders();
        }
    }
    
	// SimpleDateFormat is not thread-safe
	private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>() {
		@Override
		protected SimpleDateFormat initialValue() {
			return new SimpleDateFormat("HH:mm:ss.SSS");
		}
	};
    
    protected String format(long ms) {
    	return formatter.get().format(new Date(ms));
    }

    public abstract String dump();

    protected StringBuffer headersToString() {
        StringBuffer sb = new StringBuffer();
        if (headers != null) {
            if (printAllHeaders) {
                boolean first = true;
                for (Header h : headers) {
                    if (first) {
                        first = false;
                    } else {
                        sb.append(fieldSeparator);
                    }
                    sb.append(h.getName()).append(keyValueSeparator).append(h.getValue());
                }
            } else if (printHeaderNames != null) {
                boolean first = true;
                for (Header h : headers) {
                    if (printHeaderNames.contains(h.getName())) {
                        if (first) {
                            first = false;
                        } else {
                            sb.append(fieldSeparator);
                        }
                        sb.append(h.getName()).append(keyValueSeparator).append(h.getValue());
                    }
                }
            }
        }
        return sb.length() > 0 ? sb : sb.append("NOT_AVAILABLE");
    }
}
