/**
 * Logback: the reliable, generic, fast and flexible logging framework.
 * Copyright (C) 1999-2015, QOS.ch. All rights reserved.
 *
 * This program and the accompanying materials are dual-licensed under
 * either the terms of the Eclipse Public License v1.0 as published by
 * the Eclipse Foundation
 *
 *   or (per the licensee's choosing)
 *
 * under the terms of the GNU Lesser General Public License version 2.1
 * as published by the Free Software Foundation.
 */
package ch.qos.logback.access.pattern;

import java.util.List;

import ch.qos.logback.access.spi.IAccessEvent;
import ch.qos.logback.core.CoreConstants;

public class FullResponseConverter extends AccessConverter {

  @Override
  public String convert(IAccessEvent ae) {
    StringBuilder buf = new StringBuilder();
    
    buf.append("HTTP/1.1 ");
    int statusCode = ae.getStatusCode();
    buf.append(statusCode);
    buf.append(" ");
    buf.append(getStatusCodeDescription(statusCode));
    buf.append(CoreConstants.LINE_SEPARATOR);
    
    List<String> hnList = ae.getResponseHeaderNameList();
    for(String headerName: hnList) {
      buf.append(headerName);
      buf.append(": ");
      buf.append(ae.getResponseHeader(headerName));
      buf.append(CoreConstants.LINE_SEPARATOR);
    }
    buf.append(CoreConstants.LINE_SEPARATOR);
    buf.append(ae.getResponseContent());
    buf.append(CoreConstants.LINE_SEPARATOR);
    return buf.toString();
  }

  static String getStatusCodeDescription(int sc) {
    switch(sc) {
    case 200: return "OK";
    case 201: return "Created";
    case 202: return "Accepted";
    case 203: return "Non-Authoritative Information";
    case 204: return "No Content";
    case 205: return "Reset Content";
    case 206: return "Partial Content";
    case 300: return "Multiple Choices";
    case 301: return "Moved Permanently";
    case 302: return "Found";
    case 303: return "See Other";
    case 304: return "Not Modified";
    case 305: return "Use Proxy";
    case 306: return "(Unused)";
    case 307: return "Temporary Redirect";
    case 400: return "Bad Request";
    case 401: return "Unauthorized";
    case 402: return "Payment Required";
    case 403: return "Forbidden";
    case 404: return "Not Found";
    case 405: return "Method Not Allowed";
    case 406: return "Not Acceptable";
    case 407: return "Proxy Authentication Required";
    case 408: return "Request Timeout";
    case 409: return "Conflict";
    case 410: return "Gone";
    case 411: return "Length Required";
    case 412: return "Precondition Failed";
    case 413: return "Request Entity Too Large";
    case 414: return "Request-URI Too Long";
    case 415: return "Unsupported Media Type";
    case 416: return "Requested Range Not Satisfiable";
    case 417: return "Expectation Failed";
    case 500: return "Internal Server Error";
    case 501: return "Not Implemented";
    case 502: return "Bad Gateway";
    case 503: return "Service Unavailable";
    case 504: return "Gateway Timeout";
    case 505: return "HTTP Version Not Supported";
    default: return "NA";
    }
  }
}
