package SGO::Nick;
use 5.010;
use utf8;
use strict;
use warnings;

use SGO qw(get_dbh cache expire_cache);

use Exporter qw(import);
our @EXPORT_OK = qw(get_password_nick update_password_nick delete_nick create_nick_h get_email_nick update_email_nick);

sub _get_attr_nick {
    my ($attr, $nick) = @_;
    cache("${attr}_nick-$nick", sub {
        my ($value) = get_dbh()->selectrow_array(
            "SELECT $attr FROM nick WHERE nick = ?",
            undef,
            $nick,
        );
        $value;
    });

}

sub get_password_nick { _get_attr_nick('password', @_) }
sub get_email_nick    { _get_attr_nick('email', @_)    }

sub _update_attr_nick {
    my ($attr, $new_val, $nick) = @_;
    get_dbh()->do("UPDATE nick SET $attr = ? WHERE nick = ?", undef, $new_val, $nick);
    expire_cache("${attr}_nick-$nick");
}

sub update_password_nick { _update_attr_nick('password', @_) }
sub update_email_nick    { _update_attr_nick('email', @_)    }

sub _flush_nick_cache {
    my $nick = shift;
    expire_cache("email_nick-$nick", "password_nick-$nick");
}

sub delete_nick {
    my $nick = shift;
    get_dbh()->do('DELETE FROM nick WHERE nick = ?', undef, $nick);
    _flush_nick_cache($nick);
}

sub create_nick_h {
    my %data = @_;
    my @attrs = sort keys %data;
    get_dbh->do(
        "INSERT INTO nick(" . join(', ', @attrs) . ") VALUES ("
                    . join(', ', ('?') x @attrs) . ')',
        undef,
        @data{@attrs},
    );
    _flush_nick_cache($data{nick});
}

1;
