package egovframework.filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.HashMap;
import java.util.Map;

/**
 * XSS 필터링을 위한 HttpServletRequest 래퍼 클래스
 */
public class XssRequestWrapper extends HttpServletRequestWrapper {

    private final XssUtil xssUtil;

    public XssRequestWrapper(HttpServletRequest request, XssUtil xssUtil) {
        super(request);
        this.xssUtil = xssUtil;
    }

    @Override
    public String getParameter(String name) {
        String value = super.getParameter(name);
        return xssFilter(name, value);
    }

    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        if (values == null) {
            return null;
        }

        String[] filteredValues = new String[values.length];
        for (int i = 0; i < values.length; i++) {
            filteredValues[i] = xssFilter(name, values[i]);
        }
        return filteredValues;
    }

    @Override
    public Map<String, String[]> getParameterMap() {
        Map<String, String[]> paramMap = super.getParameterMap();
        Map<String, String[]> filteredParamMap = new HashMap<>();

        for (Map.Entry<String, String[]> entry : paramMap.entrySet()) {
            String[] values = entry.getValue();
            String[] filteredValues = new String[values.length];
            for (int i = 0; i < values.length; i++) {
                filteredValues[i] = xssFilter(entry.getKey(), values[i]);
            }
            filteredParamMap.put(entry.getKey(), filteredValues);
        }
        return filteredParamMap;
    }

    /**
     * XSS 필터링 적용
     * @param name 파라미터 이름
     * @param value 파라미터 값
     * @return 필터링된 값
     */
    private String xssFilter(String name, String value) {
        if (value == null) {
            return null;
        }

        // HTML 에디터 내용인 경우 cleanHtml 메서드 사용
        //if (name != null && (name.contains("content") || name.contains("html") || name.contains("editor"))) {
        if (name != null && (name.contains("html") || name.contains("editor"))) {
            return xssUtil.cleanHtml(value);
        }
        
        // 파일명인 경우 sanitizeFilename 메서드 사용
        if (name != null && (name.contains("filename") || name.contains("file"))) {
            return xssUtil.sanitizeFilename(value);
        }
        
        // 일반 텍스트인 경우 escape 메서드 사용
        //return xssUtil.escape(value);
        // TODO : 임시 해제!! 추후 보안을 위해 다시 적용해야함!!
        return value;
    }
}