package IdPAccountManager::Tools;

use strict;
use warnings;

use Digest::SHA;
use Encode;
use Template;

# get SHA256 hash for a string
sub sha256_hash {
    my ($s) = @_;

    return Digest::SHA::sha256_base64($s);
}

# This function generates a random password
sub generate_password {
    my $length_of_randomstring = 10;    # the length of
                                        # the random string to generate

    # plusieurs tirages :
    # 1-tirage des caractères obligatoires : les mettre dans un tableau
    my @uppers = ('A' .. 'N', 'P' .. 'Z');
    my @lowers = ('a' .. 'k', 'm' .. 'z');
    my @punctuation = (':', '!', '?', '&', '$', '=', '-', '#');
    my @numerics = ('0' .. '9');
    my @rndtab;
    push(@rndtab, $uppers[ rand @uppers ]);
    push(@rndtab, $lowers[ rand @lowers ]);
    push(@rndtab, $punctuation[ rand @punctuation ]);

    ## Pas de caractères 8bit pour l'antispam
    push(@rndtab, $numerics[ rand @numerics ]);

    # 2-tirage des caractères optionnels : les ajouter au tableau
    my @chars = (
        'a' .. 'k', 'm' .. 'z', 'A' .. 'N', 'P' .. 'Z',
        '0' .. '9', '_',        '%',        ';',
        ':',        '!',        '?',        '&',
        '$',        '*',        '(',        ')',
        '{,        }',        '[',        ']',
        '.',        '=',        '-',        '#'
    );
    foreach (5 .. $length_of_randomstring) {

        # rand @chars will generate a random
        # number between 0 and scalar @chars
        push(@rndtab, $chars[ rand @chars ]);
    }

# 3-ordonnancement de ceux-ci : les retirer aléatoirement du tableau en les concaténant dans une chaîne
    my $rndstring = '';
    my $cpt       = 1;
    while ($cpt <= $length_of_randomstring) {
        my $indice = rand @rndtab;
        $rndstring .= $rndtab[$indice];
        splice(@rndtab, $indice, 1);
        $cpt += 1;
    }
    return $rndstring;
}

## Updates simpleSamlPhp authsources.php configuration file
sub update_ssp_authsources {
    my ($templates_dir, $output, $accounts) = @_;

    my $tt2 = Template->new({
        INCLUDE_PATH => $templates_dir
    });
    my $template = 'accountProfiles/valid-accounts.php.tt2';
    my $data = {
        accounts  => $accounts,
    };

    $tt2->process($template, $data, $output) or die $tt2->error();
}

1;
__END__

=head1 NAME

IdPAccountManager::Tools - Set of subroutines usefull for the Test Account manager

=head1 DESCRIPTION

The Test Account manager instanciates test accounts associated to a SAML Identity Provider.
This module gathers a set of usefull subroutines.

=head1 FUNCTIONS

=over

=item generate_password()

Returns a random password following some security guidelines.

=item update_ssp_authsources()

Update simpleSAMLphp authsources.php configuration file with the currently valid test accounts.

=back