package PiTube;

use Mojo::Base 'Mojolicious';
use Mojo::Home;
use Mojo::Pg;
use Net::OAuth2::Profile::WebServer;
use Mojolicious::Plugin::Authentication;
use Mojolicious::Plugin::Authorization;
use PiTube::Schema;

sub startup {
    my $self = shift;

    # Nacteni konfigurace
    my $cfg = $self->plugin('Config');
    $self->helper( cfg => sub { return $cfg; } );

    $self->secrets($cfg->{session}{secrets});

    $self->plugin('PiTube::Helpers::OAuth2');

    my $home = Mojo::Home->new()->detect;

    my $pg = Mojo::Pg->new
        ->dsn($cfg->{database}{dsn})
        ->username($cfg->{database}{user})
        ->password($cfg->{database}{password})
    ;
    $pg->migrations->from_file("$home/sql/migrations.sql");
    $pg->migrations->migrate();

    # Spojeni s databazi
    my $schema = PiTube::Schema->connect($cfg->{database});

    $self->helper( schema => sub { return $schema; } );

    $self->plugin('authentication', {
        autoload_user => 1,
        load_user => sub {
            my $c = shift;
            return $c->schema->resultset('User')->find({
                uuid => $c->session->{oauth}{sub}
            });
        },
        validate_user => sub {
            my $c = shift;
            return undef if ! $c->session->{oauth};
            return $c->session->{oauth}{sub};
        },
    });

    $self->plugin('Authorization' => {
        is_role     => sub {
            my ($c, $role, $extradata) = @_;
            return 0 if ! $c->session->{oauth};

            my $client = 'pitube';
            if ( $role =~ s/\@(.+)$// ) {
                $client = $1;
            }
            return 0 if ! $c->session->{oauth}{resource_access}{$client};

            my %client_roles = map { $_ => 1 }
                @{ $c->session->{oauth}{resource_access}{$client}{roles} };

            return exists $client_roles{$role} ? 1 : 0;
        },
        user_privs  => sub {},
        has_priv    => sub {},
        user_role   => sub {},
        fail_render => { status => 401, json => {} },
    });

    my $r = $self->routes;

    $r->get('/')->to(cb => sub { shift->render('index'); });
    $r->get('/streams')->to('Stream#list');
    $r->get('/oauth2')->to('OAuth2#callback');
    $r->get('/logout')->to('OAuth2#do_logout');
    $r->post('/callback')->to('NginxRTMP#callback');
    $r->get('/play/:key')->to('Stream#player');
    $r->get('/hls/*')->to('Stream#hls');

}

1;