package PiTube::Controller::Websockets;

use Mojo::Base 'Mojolicious::Controller';
use Mojo::JSON qw(encode_json);

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

use constant SOCKET_INACTIVITY_TIMEOUT => 300;

sub main {
    my $c = shift;
#   my $ip  = $c->tx->remote_address;
    my $key = $c->req->headers->header('Sec-WebSocket-Key');

    $c->inactivity_timeout(SOCKET_INACTIVITY_TIMEOUT);

    if ($c->req->headers->header('Sec-WebSocket-Extensions') =~ /permessage-deflate/) {
        $c->tx->compressed(1);
        $c->res->headers->add('Sec-WebSocket-Extensions' => 'permessage-deflate');
    }

    $c->redis->pubsub->json('streams')->listen(
        streams => sub($pubsub, $payload) {
            $c->send({json => $payload});
        }
    );

    $c->on(json => sub( $c, $message ) {
        if ( $message->{stream} ) {

            $c->redis->db->set(
                join (':', ('live', $message->{stream}, $key)),
                'live', 'EX', 16
            );

            $c->redis->db->keys( 'live:' . $message->{stream} . ':*', sub {
                my ($db, $err, $res) = @_ ;
                $c->send(encode_json({ watchers => scalar @{ $res} }));
            });
        }
    });

    $c->on(finish => sub ($c, $code, $reason = undef) {
        $c->redis->pubsub->unlisten('streams');
        $c->app->log->debug("WebSocket closed with status $code");
    });
}

1;