package org.bndtools.utils.copy;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.Map;

public class ResourceReplacer extends Thread {
    private PipedInputStream in = null;
    private PipedOutputStream out = null;
    private Map<String, String> replaceRegularExpressions = null;
    private URL url = null;
    private IOException result = null;

    public ResourceReplacer(Map<String, String> replaceRegularExpressions, URL url) throws IOException {
        if ((replaceRegularExpressions == null) || (replaceRegularExpressions.isEmpty())) {
            this.replaceRegularExpressions = Collections.emptyMap();
        } else {
            this.replaceRegularExpressions = replaceRegularExpressions;
        }
        this.url = url;
        in = new PipedInputStream();
        out = new PipedOutputStream(in);
    }

    @Override
    public void run() {
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(), Charset.forName("UTF-8"))); //
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, Charset.forName("UTF-8")))) {
            String line;
            while ((line = reader.readLine()) != null) {
                for (Map.Entry<String, String> replaceRegularExpression : replaceRegularExpressions.entrySet()) {
                    line = line.replaceAll(replaceRegularExpression.getKey(), replaceRegularExpression.getValue());
                }
                writer.write(line);
                writer.newLine();
            }
        } catch (IOException e) {
            result = e;
        }
    }

    public PipedInputStream getStream() {
        return in;
    }

    public IOException getResult() {
        return result;
    }
}
