package Catalyst::Model::RabbitMQ;

use strict;
use warnings;

use Moose;
use Moose::Util::TypeConstraints;
use Net::RabbitFoot;
extends 'Catalyst::Model';

has 'durable' => (
    is      => 'ro',
    isa     => 'Int',
    default => 1,
);

has 'default_exchange' => (
    is      => 'ro',
    isa     => 'Str',
    default => '',
);

has 'default_routing_key' => (
    is      => 'ro',
    isa     => 'Str',
    default => '',
);

has 'options' => (
    is      => 'ro',
    isa     => 'HashRef',
    default => sub { { host => 'localhost', user => 'guest', pass => 'guest',  port => 5672, vhost => '/'} }
);

has 'queue_names' => (
    is      => 'ro',
    isa     => 'ArrayRef',
    default => sub { [] },
);

has 'queues' => (
    is      => 'ro',
    isa     => 'HashRef[Net::AMQP::Frame::Method]',
    lazy_build => 1,
    init_arg => undef
);

has 'channel' => (
    is      => 'ro',
    isa     => 'Net::RabbitFoot::Channel',
    lazy_build => 1,
    init_arg => undef
);

has 'rabbit' => (
    is         => 'ro',
    isa        => 'Net::RabbitFoot',
    handles    => qr{^?[^_].*},
    lazy_build => 1
);

our $VERSION = '0.01';

sub _build_queues {
  my $self = shift;
  my $queues = {};
  foreach my $queue (@{$self->queue_names}){ 
    $queues->{$queue} = $self->channel->declare_queue( queue => $queue, durable => $self->durable);
  }
  return $queues;
}


sub _build_channel {
  my $self   = shift;

  return $self->rabbit->open_channel();
}

sub _build_rabbit {
    my $self   = shift;

    return Net::RabbitFoot->new->load_xml_spec()->connect( %{$self->options} );
}

sub publish {
  my $self = shift;
  my ($ex, $route, $msg) = @_;
  $ex = $self->default_exchange if !defined $ex;
  $route = $self->default_routing_key if !defined $route;

  $self->channel->publish (exchange => $ex, routing_key => $route, body => $msg);
}

1;
