/*
 * 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.jena.fuseki.servlets;

import static java.lang.String.format;
import java.io.IOException;

import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletResponseWrapper;

import org.apache.jena.atlas.logging.Log;

/** Intercepting wrapper so we can track the response settings for logging purposes */

public class HttpServletResponseTracker extends HttpServletResponseWrapper
{
    private final HttpAction action;

    public HttpServletResponseTracker(HttpAction action, HttpServletResponse response) {
        super(response);
        this.action = action;
    }

    @Override
    public void sendError(int sc, String msg) throws IOException {
        action.statusCode = sc;
        action.message = msg;
        super.sendError(sc, msg);
    }

    @Override
    public void sendError(int sc) throws IOException {
        action.statusCode = sc;
        action.message = null;
        super.sendError(sc);
    }

    @Override
    public void setHeader(String name, String value) {
        super.setHeader(name, value);
        action.headers.put(name, value);
    }

    @Override
    public void addHeader(String name, String value) {
        // Fuseki only uses setHeader.
        // This is assumption checking code.
        // (No design reason why Fuseki can't use multiple headers.)
        Log.warn(this, format("addHeader(%s: %s) : Expected only setHeader - header not in response", name, value));
        super.addHeader(name, value);
    }

    @Override
    public void setStatus(int sc) {
        action.statusCode = sc;
        action.message = null;
        super.setStatus(sc);
    }

    @Override
    public void setContentLength(int len) {
        action.responseContentLength = len;
        super.setContentLength(len);
    }

    @Override
    public void setContentType(String type) {
        action.responseContentType = type;
        super.setContentType(type);
    }

      // From HttpServletResponse
//      public void addCookie(Cookie cookie) {}
//      public boolean containsHeader(String name) {}
//      public String encodeURL(String url) { }
//      public String encodeRedirectURL(String url) {}
//      public String encodeUrl(String url) {}
//      public String encodeRedirectUrl(String url) {}
//      public void sendError(int sc, String msg) throws IOException
//      public void sendError(int sc) throws IOException
//      public void sendRedirect(String location) throws IOException {}
//      public void setDateHeader(String name, long date) {}
//      public void addDateHeader(String name, long date) {}
//      public void setHeader(String name, String value)
//      public void addHeader(String name, String value)
//      public void setIntHeader(String name, int value) {}
//      public void addIntHeader(String name, int value) {}
//      public void setStatus(int sc)
//      public void setStatus(int sc, String sm)
//      public void sendRedirect(String location) throws IOException {}
//      public void setDateHeader(String name, long date) {}
//      public void addDateHeader(String name, long date) {}

        // From ServletResponse.
//         public ServletResponse getResponse() {}
//         public void setResponse(ServletResponse response) {}
//         public void setCharacterEncoding(String charset) {}
//         public String getCharacterEncoding() {}
//         public ServletOutputStream getOutputStream() throws IOException {}
//         public PrintWriter getWriter() throws IOException {}
//         public void setContentLength(int len) {}
//         public void setContentType(String type) {}
//         public String getContentType() {
//         public void setBufferSize(int size) {}
//         public int getBufferSize() {}
//         public void flushBuffer() throws IOException {}
//         public boolean isCommitted() {}
//         public void reset() {}
//         public void resetBuffer() {}
//         public void setLocale(Locale loc) {}
//         public Locale getLocale() {}
}
