#!/usr/bin/perl

# -------------------------------COMENTARIO GLOBAL---------------
# ---------------------------------------------------------------
# PROPOSITO.
# -----------
# Revisa plantillas de fid, articulo o portadas y busca las macros usadas
# Como resultado informa que macros se usan y donde, cuales no tienen uso
# y se pueden borrar
#

use strict;

main:{
	my $input = $ARGV[0];

	if (!-d $input) {
		print "$input no es directorio\n";
		print "perl cgi-cpn/utils/prontus_busca_macros.pl <prontus_id>/cpan/fid\n";
		print "perl cgi-cpn/utils/prontus_busca_macros.pl <prontus_id>/plantillas/artic/fecha/pags\n";
		print "perl cgi-cpn/utils/prontus_busca_macros.pl <prontus_id>/plantillas/edic/nroedic/port\n";
		print "perl cgi-cpn/utils/prontus_busca_macros.pl <prontus_id>/plantillas/tax/port\n";
		exit;
	}

	print "Revisando $input\n";
	if ($input =~ /fid\/?$/) {
		my $macrosdir = "$input/macros/";
		my %macros;
		my @entries = &lee_dir($macrosdir);
		foreach my $k (@entries) {
			next if ($k eq '.' || $k eq '..');
			if (-f $macrosdir . $k) {
				$macros{$k} = 0;
				foreach my $file (@entries) {
					next if ($file eq '.' || $file eq '..');
					my $content = &read_file("$macrosdir/$file");
					if ($content =~ /\Q$k\E/) {
						print "[$k] -> [$file]\n";
						$macros{$k} = 1;
					}
				}
				my @fids = &lee_dir($input);
				foreach my $fid (@fids) {
					next if ($fid eq '.' || $fid eq '..');
					my $content = &read_file("$input/$fid");
					if ($content =~ /\Q$k\E/) {
						print "[$k] -> [$fid]\n";
						$macros{$k} = 1;
					}
				}
			}
		}
		foreach my $macro (sort keys %macros) {
			print "[$macro] sin uso\n" if (!$macros{$macro});
		}
	} elsif ($input =~ /(.*)\/(port|pags)\/?$/) {
		my $macrosdir = "$1/macros/";
		my %macros;
		my @entries = &lee_dir($macrosdir);
		foreach my $k (@entries) {
			next if ($k eq '.' || $k eq '..');
			if (-f $macrosdir . $k) {
				$macros{$k} = 0;
				foreach my $file (@entries) {
					next if ($file eq '.' || $file eq '..');
					my $content = &read_file("$macrosdir/$file");
					if ($content =~ /\Q$k\E/) {
						print "[$k] -> [$file]\n";
						$macros{$k} = 1;
					}
				}
				my @plts = &lee_dir($input);
				foreach my $plt (@plts) {
					next if ($plt eq '.' || $plt eq '..');
					my $content = &read_file("$input/$plt");
					if ($content =~ /\Q$k\E/) {
						print "[$k] -> [$plt]\n";
						$macros{$k} = 1;
					}
				}
			}
		}
		foreach my $macro (sort keys %macros) {
			print "[$macro] sin uso\n" if (!$macros{$macro});
		}
	}
}

#-----------------------------------------------------------------------#
# Funciones de apoyo, tomadas de la glin_fildir_02.pm
#-----------------------------------------------------------------------#
sub lee_dir {
# Lee un directorio y entrega la lista ordenada de entries en bruto.
# Param. de entrada :
# 0) Path real del directorio.
# Retorna : Arreglo ordenado de entradas en bruto del directorio.

	my($eldir) = $_[0];
	# Abre directorio.
	opendir(DIR, $eldir) || die "Can't opendir" . $eldir . $!;
	my @entries = readdir(DIR);
	closedir DIR;
	# Ordena entries alfabeticamente.
	@entries = sort @entries;
	return @entries;
}
#-------------------------------------------------------------------------#
sub read_file {
# Lee un archivo por completo.
# Param. de entrada :
# 0) Path real del archivo.
# Retorna : El texto leido | '' en caso que el archivo no exista.

	my($archivo) = $_[0];
	my($size) = (-s $archivo);
	my($buffer) = '';

	if (-e $archivo) {
		open(my $ARCHIVO,"<", $archivo)
		  || die "Fail Open file $archivo \n $!\n";
		binmode $ARCHIVO;
		read $ARCHIVO,$buffer,$size;
		close $ARCHIVO;
	}

	return $buffer;
}
