package SeMeet::Schema::Result::Meet;

use strict;
use warnings;
use feature 'signatures';
no warnings qw{ experimental::signatures } ;

use base 'DBIx::Class::Core';
use Mojo::JWT;
use JSON;

use constant JWT_DEFAULT_LIFETIME => 3600 * 24 * 7;

our $VERSION = 1;

__PACKAGE__->table('meets');

__PACKAGE__->add_columns(
    id => {
        data_type         => 'integer',
        is_auto_increment => 1,
        is_nullable       => 0,
        sequence          => 'uid_seq'
    },
    qw(
        uuid
        owner_id
        deleted
        name
        description
        properties
    ),
);

__PACKAGE__->set_primary_key('id');

__PACKAGE__->add_unique_constraint(
    'uuid' => [qw(uuid)]
);

__PACKAGE__->belongs_to(
    owner => 'SeMeet::Schema::Result::User',
    {
        'foreign.id' => 'self.owner_id',
    },
);

__PACKAGE__->has_many(
    meet_groups => 'SeMeet::Schema::Result::MeetGroup',
    { 'foreign.meet_id' => 'self.id', },
);

__PACKAGE__->has_many(
    moderators => 'SeMeet::Schema::Result::Moderator',
    { 'foreign.meet_id' => 'self.id', },
);

__PACKAGE__->has_many(
    groups => 'SeMeet::Schema::Result::MeetGroup_view',
    { 'foreign.meet_id' => 'self.id', },
);

__PACKAGE__->inflate_column('properties', {
    inflate => sub { from_json(shift); },
    deflate => sub { to_json(shift); },
});

sub update_groups_cache($self) {
    my @groups = ();
    foreach my $group ($self->groups) {
        push @groups, {
            id    => $group->group_id,
            name => $group->group_name
        };
    }
    my $properties =  $self->properties // {};
    $properties->{groups} = \@groups;
    $self->update({properties => $properties});
}

sub update_moderators_cache($self) {
    my @moderators = ();
    foreach my $moderator ($self->moderators) {
        push @moderators, {
            id   => $moderator->octid,
            name => $moderator->name,
        };
    }
    my $properties =  $self->properties // {};
    $properties->{moderators} = \@moderators;
    $self->update({properties => $properties});
}

sub cached_groups($self) {
    my $properties = $self->properties // {};
    if (exists $properties->{groups} && ref $properties->{groups} eq 'ARRAY') {
        return $properties->{groups};
    }
    return [];
}

sub cached_moderators($self) {
    my $properties = $self->properties // {};
    if (exists $properties->{moderators} && ref $properties->{moderators} eq 'ARRAY') {
        return $properties->{moderators};
    }
    return [];
}

1;