#!/usr/bin/env php

<?php

/**
rename multiple files and directories using your text editor

Usage:
1. go into the directory that contains all the files and directories you want to rename
2. run file_renamer
3. enter the newly created directory "converted"
4. Open "file_names.txt" with a text editor
5. Change the text *after* the index at the beginning of the line [xx] into whatever you desire. Don't touch the index!
Example:
[03]My_old_file_name.txt    ---> [03]fancy_new_name.txt
6. Save "file_names.txt"
7. Run file_renamer again (don't change directory).
8. Remove the directory "converted"
*/

define('FOLDER', 'renamed');
define('FILE_NAMES', 'file_names.txt');

$file_names_file = FOLDER . '/' . FILE_NAMES;

function getFiles($dir){
    return array_filter(scandir($dir, SCANDIR_SORT_ASCENDING), function($f){
	    return ! in_array($f, ['.', '..', FOLDER, FILE_NAMES], false);
	});
}

function createIndexedFileArray(array $file_string_array): array
{
	$return = [];
	$file_string_array = array_filter($file_string_array);
	foreach($file_string_array as $file_string){
		$splitted = array_filter(preg_split('/[\[\]]/', $file_string));
		$index = array_shift($splitted);
		$cleaned_file_name = array_shift($splitted);
		
		$return[$index] = [$file_string, $cleaned_file_name];
	}	
	return $return;	
}

if(file_exists($file_names_file)){
	$file_names = explode(PHP_EOL, file_get_contents($file_names_file));	
	$new_files = createIndexedFileArray($file_names);
	$old_file_array = createIndexedFileArray(getFiles('./'. FOLDER));
	foreach($new_files as $new_file_index => $new_file){
		$new_file_name = $new_file[1];
		$old_file_name = $old_file_array[$new_file_index][0];
		echo $new_file_name . PHP_EOL;
		echo $old_file_name . PHP_EOL;
		rename('./' . FOLDER . '/' . $old_file_name, $new_file_name);
	}
	
	exit();
}

@mkdir(FOLDER);

$files = getFiles('.');

$digits = ceil(log(max(array_keys($files)), 10));

$all_file_names = [];
foreach($files as $key => $file){
	$new_name = '[' . str_pad($key, $digits, '0', STR_PAD_LEFT) . ']' . $file;
	rename($file, FOLDER . '/' . $new_name);
	$all_file_names[] = $new_name;
}

file_put_contents($file_names_file, implode(PHP_EOL, $all_file_names)); 



