package API::Matterbridge;
use strict;
use warnings;
use Moo::Role 2;

use Filter::signatures;
use feature 'signatures';
no warnings 'experimental::signatures';

use URI;

requires 'build_request', 'short_ua', 'stream_ua';

our $VERSION = '0.02';

=head1 SEE ALSO

L<https://app.swaggerhub.com/apis-docs/matterbridge/matterbridge-api/0.1.0-oas3>

=cut

# Naah, this should move straight to Mojolicious
# instead of separating out a protocol module that can be used elsewhere ...
# The message stream (via /api/stream) needs special async handling and can't
# be used with (for example) LWP

has 'url' => (
    is => 'lazy',
    default => sub { URI->new( 'http://localhost:4242/api/' ) },
);

has 'health_url' => (
    is => 'lazy',
    default => sub { URI->new( $_[0]->url . 'health' ) },
);

has 'message_url' => (
    is => 'lazy',
    default => sub { URI->new( $_[0]->url . 'message' ) },
);

has 'messages_url' => (
    is => 'lazy',
    default => sub { URI->new( $_[0]->url . 'messages' ) },
);

has 'stream_url' => (
    is => 'lazy',
    default => sub { URI->new( $_[0]->url . 'stream' ) },
);

has 'json' => (
    is => 'lazy',
    default => sub {
        require JSON;
        return JSON->new()
    },
);

sub build_post_message( $self, %options ) {
    $self->build_request(
        method => 'POST',
        url    => $self->message_url,
        headers => {
            'Content-Type' => 'application/json',
        },
        data   => $self->json->encode( \%options ),
        ua     => $self->short_ua,
    );
}

sub build_get_messages( $self ) {
    $self->build_request(
        method => 'GET',
        url    => $self->messages_url,
        ua     => $self->short_ua,
    );
}

sub build_get_message_stream( $self ) {
    $self->build_request(
        method => 'GET',
        url    => $self->stream_url,
        ua     => $self->stream_ua,
    );
}

1;

=head1 REPOSITORY

The public repository of this module is
L<https://github.com/Corion/Mojolicious-Matterbridge>.

=head1 SUPPORT

The public support forum of this module is L<https://perlmonks.org/>.

=head1 BUG TRACKER

Please report bugs in this module via the Github bug queue at
L<https://github.com/Corion/Mojolicious-Matterbridge/issues>

=head1 AUTHOR

Max Maischein C<corion@cpan.org>

=head1 COPYRIGHT (c)

Copyright 2020 by Max Maischein C<corion@cpan.org>.

=head1 LICENSE

This module is released under the same terms as Perl itself.

=cut