/**
 * 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.creadur.tentacles;

import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.Map;

public class Licenses {

    private final IOSystem ioSystem;
    private final Map<String, String> licenses;

    public Licenses(final Map<String, String> licenses, final Platform platform) {
        super();
        this.ioSystem = platform.getIoSystem();
        this.licenses = Collections.unmodifiableMap(licenses);
    }

    public License from(final File document) throws IOException {
        return license(this.ioSystem.slurp(document));
    }

    private License license(final String text) {
        final String key = toKey(text);
        return new License(key, normalize(text));
    }

    private String toKey(final String text) {
        return text.replaceAll("[ \\n\\t\\r]+", "").toLowerCase().intern();
    }

    private String normalize(String text) {
        for (final Map.Entry<String, String> license : this.licenses.entrySet()) {
            text =
                    text.replace(
                            license.getValue(),
                            String.format("---[%s - full text]---\n\n",
                                    license.getKey()));
        }
        text = text.intern();
        return text;
    }
}
