// FilePathAutoRename.cpp

#include "StdAfx.h"

#include "../../Common/Defs.h"
#include "../../Common/IntToString.h"

#include "../../Windows/FileFind.h"

#include "FilePathAutoRename.h"

using namespace NWindows;

static bool MakeAutoName(const FString &name,
    const FString &extension, unsigned value, FString &path)
{
  FChar number[16];
  ConvertUInt32ToString(value, number);
  path = name;
  path += number;
  path += extension;
  return NFile::NFind::DoesFileOrDirExist(path);
}

bool AutoRenamePath(FString &fullProcessedPath)
{
  FString path;
  int dotPos = fullProcessedPath.ReverseFind(FTEXT('.'));

  int slashPos = fullProcessedPath.ReverseFind(FTEXT('/'));
  #ifdef _WIN32
  int slash1Pos = fullProcessedPath.ReverseFind(FTEXT('\\'));
  slashPos = MyMax(slashPos, slash1Pos);
  #endif

  FString name, extension;
  if (dotPos > slashPos && dotPos > 0)
  {
    name.SetFrom(fullProcessedPath, dotPos);
    extension = fullProcessedPath.Ptr(dotPos);
  }
  else
    name = fullProcessedPath;
  name += L'_';
  unsigned left = 1, right = (1 << 30);
  while (left != right)
  {
    unsigned mid = (left + right) / 2;
    if (MakeAutoName(name, extension, mid, path))
      left = mid + 1;
    else
      right = mid;
  }
  return !MakeAutoName(name, extension, right, fullProcessedPath);
}
