/*
 * Copyright 2000-2012 JetBrains s.r.o.
 *
 * Licensed 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.jetbrains.idea.svn.history;

import com.intellij.openapi.util.text.StringUtil;
import org.jetbrains.idea.svn.SvnUtil;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.internal.util.SVNPathUtil;

import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * User: Irina.Chernushina
 * Date: 8/30/12
 * Time: 5:18 PM
 *
 * We consider here, that history is traversed "from now to past"
 */
public class SvnPathThroughHistoryCorrection implements LogEntryConsumer {
  private String myBefore;
  private String myPath;
  private LogEntryPath myDirectlyMentioned;
  private boolean myRoot;

  public SvnPathThroughHistoryCorrection(String path) {
    myPath = path;
    myBefore = path;
    myRoot = StringUtil.isEmpty(path);
  }

  @Override
  public void consume(LogEntry logEntry) throws SVNException {
    if (myRoot) {
      return;
    }
    myBefore = myPath;
    myDirectlyMentioned = null;
    final Map<String,LogEntryPath> paths = logEntry.getChangedPaths();
    final LogEntryPath entryPath = paths.get(myPath);
    if (entryPath != null) {
      myDirectlyMentioned = entryPath;
      // exact match
      if (entryPath.getCopyPath() != null) {
        myPath = entryPath.getCopyPath();
        return;
      }
    }
    for (LogEntryPath path : paths.values()) {
      // "the origin path *from where* the item, ..."
      // TODO: this could incorrectly handle case when parent folder was replaced - see IDEA-103042
      // TODO: or several parent folder renames occur IDEA-96825
      final String copyPath = path.getCopyPath();
      if (copyPath != null) {
        final String thisEntryPath = path.getPath();
        if (parentPathChanged(copyPath, thisEntryPath)) {
          return;
        }
      }
    }
  }

  private boolean parentPathChanged(String copyPath, String thisEntryPath) throws SVNException {
    if (SVNPathUtil.isAncestor(thisEntryPath, myPath)) {
      final String relativePath = SVNPathUtil.getRelativePath(thisEntryPath, myPath);
      myPath = SvnUtil.appendMultiParts(copyPath, relativePath);
      return true;
    }
    return false;
  }

  public String getBefore() {
    return myBefore;
  }

  public LogEntryPath getDirectlyMentioned() {
    return myDirectlyMentioned;
  }

  public String getCurrentPath() {
    return myPath;
  }

  public boolean isRoot() {
    return myRoot;
  }
}
