/************************************\
 *                                  *
 *   scritto da zero per CloseBSD   *
 *                                  *
 *   ultima modifica: 13/10/2026    *
 *                                  *
\************************************/

/*
 *  se faccio 'rnm dir1 dir2/dir3' non dovrebbe essere dir2/dir1 invece di dir2/dir3/dir1?
 *  questo concetto qui astrae troppo! e' l'idea del "move", che e' sbagliata
 *  perche' nell'informatica non si puo' "spostare" un file !!
 *  lo si puo' copiare uguale in un'altra locazione,
 *  o si puo' cambiare il "nome" che si riferisce ad esso
 *
 *  dovrei fare la verifica se la cartella esiste e/o contiene elementi
 *  se e' vuota la sostituisco, se no do errore
 *  o copio solo i file che non ci sono, anche se questo fa un gran pastrocchio
 */

// se file comincia per '/'? 
// che succede se src e' root??
// separa errori

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>

#define	SIZE	30

int main(int argc, char *argv[])
{
	char fullpath[SIZE];
	char src[SIZE], dest[SIZE];
	struct stat st_src, st_dest;
	char *tok;

	if (argc < 3) {
		printf("%s: almeno 2 argomenti\n", argv[0]);
		return 1;
	}

	/*
	 *   estrai src da fullpath, e "riscrivi" fullpath.
	 */
	strcpy(fullpath, argv[1]);
	tok = strtok(fullpath, "/");
	while (tok != NULL) {
		strcpy(src, tok);
		tok = strtok(NULL, "/");
	} strcpy(fullpath, argv[1]);

	if (strcmp(".", argv[2]) == 0)
		getcwd(dest, SIZE);
	else strcpy(dest, argv[2]);

	stat(fullpath, &st_src);
	stat(dest, &st_dest);

	/*
	 *   se argv[2] e' dir.
	 */
	if(S_ISDIR(st_dest.st_mode)) {
		if(S_ISREG(st_src.st_mode)) {
			/*
			 *  dato che rename() richiede che src e dest siano dello stesso tipo,
			 *  nel caso in cui argv[1] sia un file anche argv[2] va "trasformata" in file,
			 *  e per fare questo appendo src a dest.
			 *
			 *  infatti la funzione rename() non "sposta" automaticamente il file
		         *  nella dir, ma ha bisogno del fullpath.
			 */
			if (dest[strlen(dest) - 1] != '/')
				strcat(dest, "/");
			strcat(dest, src);
		}

		if (rename(fullpath, dest) == 0)
			printf("\trinomino: %s > %s\n", fullpath, dest);
		else perror(src);
	}

	/*
	 *   se argv[1] e argv[2] sono 2 files.
	 */
	else if (rename(fullpath, dest) == 0)
		printf("\trinomino: %s > %s\n", fullpath, dest);
	else perror(src);

	return 0;
}
