package scribe.writer.action

import java.nio.file.{Files, Path, Paths}

import scribe.writer.file.LogFile
import perfolation._

object BackupPathAction extends Action {
  override def apply(previous: LogFile, current: LogFile): LogFile = {
    current.dispose()
    pushBackups(current.path)
    Files.createFile(current.path)
    current.replace()
  }

  private def pushBackups(path: Path, increment: Int = 1): Unit = {
    val backup = backupPath(path, increment)
    if (Files.exists(backup)) {
      pushBackups(path, increment + 1)
    }
    val current = backupPath(path, increment - 1)
    val lastModified = Files.getLastModifiedTime(current)
    Files.move(current, backup)
    Files.setLastModifiedTime(backup, lastModified)
  }

  private def backupPath(path: Path, increment: Int): Path = if (increment > 0) {
    val absolute = path.toAbsolutePath.toString
    val idx = absolute.lastIndexOf('.')
    val absolutePath = p"${absolute.substring(0, idx)}.$increment.${absolute.substring(idx + 1)}"
    Paths.get(absolutePath)
  } else {
    path
  }
}