#!/usr/bin/perl -w

use 5.034;

for ( qw(which echo) ){
    my $good = `which $_`;
    if (length($good) < 3){
	say "$_ not present. Aborting yet.\n";
	exit -10;
    }
}

my $file = "crm.csv";
my $memo = "crm.memo";
my $appointments = "crm.appointments";

unless (@ARGV){
    say "\nUsage: $0 <data|list>";
    say "";
    say "Data - input, dump or modify database";
    say "List - review the data and make calls";
    say "";
    exit -1;
}

unless (-e $file){
    system "echo > $file";
}
unless (-e $memo){
    system "echo > $memo";
}
unless (-e $appointments){
    system "echo > $appointments";
}

# muestreo rotatorio con intervalos mínimos (no posible sin hacerlo demonio) y máximos

my $args = join " ", @ARGV;
my ($n,$p,$ph);   # name, PID, phone(s)

if ($args =~ /data/i){
    
    my $resp = 1000;
    while ($resp > 0) {

	$resp = menu();     # Esta línea presenta un menu principal de la opción "data" 
	
	if ($resp == 1){
	    say "";
	    say "\nCREATION PROCEDURE\n";
	    say "Whithout commas,\n";
	    print "\nFull name: ";
	    chomp (my $n = <STDIN>);
	    $n =~ s/\,//g;
	    print "\nPID: ";
	    chomp (my $p = <STDIN>);
	    $p =~ s/\,//g;
	    print "\nPhone(s): ";
	    chomp (my $ph = <STDIN>);
	    $ph =~ s/\,/-/g;
	    open OUT, ">>", $file or die $!;
	    say OUT "$n,$p,$ph,". infofecha() .",";
	    close OUT;
	    print "\a";
	}elsif ($resp == 2){
	    say "";
	    say "\nDELETE PROCEDURE\n";
	    print "Say yes to continue: ";
	    chomp (my $confir = <STDIN>);
	    if ($confir =~ /yes/i){
		($n, $p, $ph) = ask(1);
		open IN, "<", $file or die $!;
		my @g = <IN>;
		close IN;
		open OUT, ">", $file or die $!;   
		for (@g) {
		    unless (/$n/i && /$p/i && /$ph/i){
			say OUT $_;
		    }
		}
		close OUT;
	    }
	    print "\a";
	}elsif ($resp == 3){
	    say "";
	    say "\nMODIFY PROCCESS:\n";
	    ($n, $p, $ph) = ask(1);
		
#		print "\nName: ";
#		chomp ($n = <STDIN>);
#		$n =~ s/\,//g;
#		print "\nPID: ";
#		chomp ($p = <STDIN>);
#		$p =~ s/\,//g;
#		print "\nPhone(s): ";
#		chomp ($ph = <STDIN>);
#		$ph =~ s/\,/-/g;
		
	    open IN , "<", $file or die $!;
	    my @g = <IN>;
	    close IN;
	    open OUT, ">", $file or die $!;
	    if (/$n/i || /$p/i || /$ph/i){		  
		print OUT "$n,$p,$ph," ;
		while ( /\,(\d{8})/ ){
		    print OUT $1 . ",";
		}
		say OUT infofecha().",";
		say OUT "";
	    }else{
		say OUT $_;
	    }
	    close OUT;
	    print "\a";
	}elsif ($resp == 4){
	    say "";
	    say "\nDATA DUMP BEGIN HERE";
	    say "====================";
	    open IN, "<", $file or die $!;
	    print $_ for (<IN>);
	    close IN;
	    say "==================";
	    say "DATA DUMP END HERE";
	    say "==================\n";
	}elsif ($resp == 5){
	    say "";
	    say "\nMEMOS DUMP BEGIN HERE";
	    say "=====================";
	    open IN, '<', $memo or die $!;
	    print $_ for <IN>;
	    close IN;
#		system "cat $memo";
	    say "===================";
	    say "MEMOS DUMP END HERE";
	    say "===================\n";
	}elsif ($resp == 6) {		
	    say "";
	    say "\nAPPOIMENTS DUMP BEGIN HERE";
	    say "==========================";
	    open IN, '<', $appointments or die $!;
	    print $_ for <IN>;
	    close IN;
##		system "cat $appointments";
	    say "========================";
	    say "APPOIMENTS DUMP END HERE";
	    say "========================\n";
	}elsif ($resp == 7){
	    ask(2);
	}else{
#	    last;             # exit of the program
	    $resp = 0;        # soft exit
	}
	if ($resp >= 4 && $resp <=7){
	    my $pause = <STDIN>;
	    print "\a";
	}
    }

}elsif ($args =~ /list/i){                 # Aquí está lo principal del programa, el objetivo "list"

    say "";
    print "\nMax time passed since last call (example 100 days): ";
    chomp (my $max = <STDIN>);
    if ($max eq "" || 0+$max ne $max || $max <0) { $max = 0; }
    say "\nList of entries with dates lower than max time reached";
    say "------------------------------------------------------\n";
    my $nowuseful = infofecha() - $max;
    
    open IN, "<", $file or die $!;
    my @global = <IN>;
    close IN;
        
    for (@global){
	chomp;
	/\,(\d{8})\,/;
	if (defined $1){
	    if ($1 <= $nowuseful){
		say $_;
	    }
	}
    }

    say "=== Phone calls to be done/undone ===";
    open AP, "+<", $appointments or die $!;
    seek (AP, 0, 1);
    my @aps = <AP>;
    my $tmp;
    for my $l (@global){
	### delicado, es modificación porque hay que añadir infofecha a las lineas
	chomp $l;
	say $l;    # client data
	for my $aa (@aps){
	    $aa =~ /(.+)\,/;
	    if (defined $1){
		$tmp = $1;
		if ( $l =~ /$tmp/i ){
		    print "Appointement => $tmp,";
		    while ($aa =~ /\,(\d{8})/g){
			if (defined $1){
			    print "$1,";     # past or future appointment
			}
		    }
		    say "";
		}
	    }
	}
	$l =~ /\,(\d{8})\,$/;
	if (defined $1){
	    if ($1 <= $nowuseful){
		print "\t===> Call? [y/N]: ";
		chomp (my $yn = <STDIN>);
		my $ref;
		$l =~ /(.+)\,\d{8}\,/;
		if (defined $1){
		    $ref = $1;
		    if ($yn =~ /[Y|y]/){
			my $line = $l . infofecha() . ",";
			open OUT, ">>", $file or die $!;
			say OUT $line;
			close OUT;
			open MEMO, ">>", $memo or die $!;
			my $last = tell( MEMO );
			seek (MEMO, 0, 1);
			my $ok;
			while (<MEMO>){
			    chomp;
			    if (/\,\d{8}\,/ && /$ref/i){ $ok++; }
			    say ":: ", $_ if $ok;
			    if ( /\,\d{8}\,/ && $_ !~ /$ref/i ){
				$ok =0;
			    }
			}
			seek (MEMO, $last, 0);
			say MEMO $line if ($line);
			my $note = ">";
			while ($note !~ /^\s*$/){		    
			    print ">";
			    chomp ($note = <STDIN>);
			    say MEMO $note if ($note);
			}
			say MEMO "Closed at ", scalar(localtime());
			close MEMO;
		    }else{
#		                        makenewappointment();
again:		    
			  print "Insert ISO date (i.e. 19991231 - 8 digits - or nothing to escape) to make a new appointment: ";
			chomp (my $dateap = <STDIN>);
			if (defined $dateap){
			    if ($dateap =~ /^\d{8}$/){ 
				say AP $ref . "," . $dateap;
			    }elsif ($dateap eq ""){
				# escape
			    }else{
				goto again;
			    }
			} 
		    }
		}
	    }
	}
    }
    close AP;
}

say "\nGood bye!";

exit 3;

sub menu {
    my $r;
top:    
    system "clear";
    say "\nCRM DATA MENU:\n";
    say "1) Altas [default]\n";
    say "2) Bajas\n";
    say "3) Modificaciones\n";
    say "4) Dump data\n";
    say "5) Dump memos\n";
    say "6) Dump appointments\n";
    say "7) Consultas\n";
    say "0) Salir\n\n";
    print "?> ";
    chomp ($r = <STDIN>);
    if ($r =~ /[1|A|a|\n]/){
	return 1;
    }elsif ($r =~ /[2|B|b]/){
	return 2;
    }elsif ($r =~ /[3|M|m]/){
	return 3;
    }elsif ($r =~ /[4|D|d]/){
	return 4;
    }elsif ($r =~ /[5|O|o]/){
	return 5;
    }elsif ($r =~ /[6|P|p]/){
	return 6;
    }elsif ($r =~ /[7|C|c]/){
	return 7;
    }elsif ($r =~ /[0|S|s|\-]/){
	return 0;
    }else{
#	goto top;
    }
}

sub ask {
    my $opt = shift;
    system "clear";
    print "\nName: ";
    chomp (my $n = <STDIN>);
    print "\nPID: ";
    chomp (my $p = <STDIN>);
    print "\nPhone: ";
    chomp (my $ph = <STDIN>);
    open IN, "<", $file or die $!;
    my @g = <IN>;
    close IN;
    say "\nSelected record(s):";
    say "-------------------\n";
    my $c =0;
    for (@g){
	chomp;
	if (/$n/i && /$p/i && /$ph/i){
	    say $_;
	    $c++;
	}
	if ($opt == 2 && (/$n/ || /$p/ || /$ph/) ){
	    say $_;
	    $c++;
	}
    }
    say "Count $c record(s)";
    say "Select better to modify or delete." if $c > 1;
    
    return ($n, $p, $ph);
}

sub normaltoISO {
    my $f = shift;
    my $d = substr $f, 0, 2, "";
    my $m = substr $f, 0, 2, "";
    my $ISO = $f . $m . $d;
    return $ISO;
}

sub ISOtonormal {
    my $f = shift;
    my $y = substr $f, 0, 4, "";
    my $m = substr $f, 0, 2, "";
    my $normal = $f . $m . $y;
    return $normal;
}
    
sub infofecha {
#    my $i = shift;
    my $i = scalar localtime();
    my @datetime = split " ", $i;
                  
    my $anyo = $datetime[4];
    #    if ($anyo<66) { $anyo += 2000; }
    #    elsif ($anyo<100) { $anyo += 1900; }
    my %mes = (
        Jan => "01",
        Feb => "02",
        Mar => "03",
        Apr => "04",
        May => "05",
        Jun => "06",
        Jul => "07",
        Aug => "08",
        Sep => "09",
        Oct => "10",
        Nov => "11",
        Dec => "12",
    );
                                                          
    my $nmes = $mes{ $datetime[1] };
    my $j = $datetime[2];
#    $j-- if ($AYER);         # BUG GRATUITO INCLUIDO: No funciona el día 1 de cada mes
    my $dia = sprintf "%02d", $j;
    return $anyo  . $nmes   . $dia;
}

__END__
  
v.0.001 UNTESTED
v.0.002 UNTESTED Added memo fields for calls
v.0.003 UNTESTED Added appointments
  
