// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

package com.google.dart.compiler;

import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.net.URI;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Testing implementation of {@link DartArtifactProvider}.
 */
public class MockArtifactProvider extends DartArtifactProvider {

  private static class Artifact {
    StringWriter writer = new StringWriter();
    long lastModified;
  }

  private final Map<String, Artifact> artifacts = new ConcurrentHashMap<String, Artifact>();

  public MockArtifactProvider() {
  }

  @Override
  public Reader getArtifactReader(Source source, String part, String ext) {
    Artifact artifact = artifacts.get(keyFor(source, part, ext));
    if (artifact == null) {
      return null;
    }
    return new StringReader(artifact.writer.toString());
  }

  @Override
  public URI getArtifactUri(Source source, String part, String ext) {
    return URI.create("file:" + keyFor(source, part, ext));
  }

  @Override
  public Writer getArtifactWriter(Source source, String part, String ext) {
    Artifact artifact = new Artifact();
    artifacts.put(keyFor(source, part, ext), artifact);
    artifact.lastModified = System.currentTimeMillis();
    return artifact.writer;
  }

  @Override
  public boolean isOutOfDate(Source source, Source base, String ext) {
    Artifact artifact = artifacts.get(keyFor(base, "", ext));
    if (artifact == null) {
      return true;
    }

    return source.getLastModified() > artifact.lastModified;
  }

  /**
   * Quick way to get an artifact without going through the reader.
   */
  public String getArtifactString(Source source, String part, String ext) {
    Artifact artifact = artifacts.get(keyFor(source, part, ext));
    if (artifact == null) {
      return null;
    }

    return artifact.writer.toString();
  }

  /**
   * Removes the given artifact, by name.
   */
  public void removeArtifact(String name, String part, String ext) {
    artifacts.remove(keyFor(name, part, ext));
  }

  private String keyFor(Source source, String part, String ext) {
    return keyFor(source.getName(), part, ext);
  }

  private String keyFor(String sourceName, String part, String ext) {
    if (!part.isEmpty()) {
      part = "$" + part;
    }
    return sourceName + part + "/" + ext;
  }
}
