/*******************************************************************************
 * Copyright (c) 2010-2014 SAP AG and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.skalli.testutil;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;

@SuppressWarnings("nls")
public class HttpServerMock implements Runnable {

    private String host = "localhost";
    private int port = 12421; // just an arbitrary port
    private Thread t;
    private Map<String, String> bodies = new HashMap<String, String>();
    private ServerSocket server;

    public HttpServerMock() {
        String systemPropertyHost = System.getProperty("httpservermock.host");
        if (StringUtils.isNotBlank(systemPropertyHost)) {
            this.host = systemPropertyHost;
        }
        String sytemPropertyPort = System.getProperty("httpservermock.port");
        if (StringUtils.isNotBlank(sytemPropertyPort) && StringUtils.isNumeric(sytemPropertyPort)) {
            this.port = Integer.valueOf(sytemPropertyPort);
        }
    }

    public HttpServerMock(Map<String, String> map) {
        this();
        for (String contentId : map.keySet()) {
            addContent(contentId, map.get(contentId));
        }
    }

    public void addContent(String contentId, String content) {
        synchronized (bodies) {
            bodies.put(contentId, content);
        }
    }

    public String getHost() {
        return host;
    }

    public int getPort() {
        return port;
    }

    public void start() {
        if (t != null) {
            return;
        }
        t = new Thread(this);
        t.start();
    }

    public void stop() {
        if (t == null) {
            return;
        }
        try {
            synchronized (server) {
                server.close();
            }
            t.interrupt();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        BufferedReader request = null;
        DataOutputStream response = null;
        try {
            server = new ServerSocket(port);
            while (true) {
                Socket connection = server.accept();

                request = new BufferedReader(new InputStreamReader(connection.getInputStream(), "ISO8859_1"));
                response = new DataOutputStream(connection.getOutputStream());

                String httpCode;
                String contentId = "";
                String requestLine = request.readLine();

                if (!StringUtils.startsWithIgnoreCase(requestLine, "GET")) {
                    httpCode = "405";
                } else {
                    String path = StringUtils.split(requestLine, " ")[1];
                    int n = StringUtils.lastIndexOf(path, "/");
                    contentId = StringUtils.substring(path, 1, n);
                    httpCode = StringUtils.substring(path, n + 1);
                }

                String content = bodies.get(contentId);
                StringBuffer sb = new StringBuffer();
                sb.append("HTTP/1.1 ").append(httpCode).append(" CustomStatus\r\n");
                sb.append("Server: MiniMockUnitServer\r\n");
                sb.append("Content-Type: text/plain\r\n");
                if (content != null) {
                    sb.append("Content-Length: ").append(content.length()).append("\r\n");
                }
                sb.append("Connection: close\r\n");
                sb.append("\r\n");
                if (content != null) {
                    sb.append(content);
                }

                response.writeBytes(sb.toString());
                IOUtils.closeQuietly(response);
            }
        } catch (IOException e) {
            IOUtils.closeQuietly(request);
            IOUtils.closeQuietly(response);
        } finally {
            try {
                server.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
