#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;
use Mojolicious::Lite;
use Mojolicious::Plugin::Database;
use Mojolicious::Plugin::Util::RandomString;
use JSON;

use Tropo;
use Tropo::RestAPI::Session;

$ENV{MOJO_MODE} = 'development';

plugin database => {
    dsn => 'DBI:SQLite:tropo',
};

plugin 'Util::RandomString';

my $token = 'your_api_token';

# show form and ask user to submit
# her phone number
get '/' => sub {
    my $self = shift;

    $self->app->log->error( 'form requested' );

    $self->stash( WILL_CALL => 0 );
    $self->render( 'form' );
};

# save phone number in db and 
# create new tropo session
post '/' => sub {
    my $self = shift;

    $self->app->log->error( 'form submitted' );

    $self->stash( WILL_CALL => 0 );
    my $phone = $self->param( 'phone' );

    if ( !$phone ) {
        $self->stash( PHONE_ERROR => 1 );
    }
    else {
        my $id = $self->random_string;

        my $insert = qq~
            INSERT INTO
                calls (phone, session)
                VALUES (?,?)~;

        $self->db->do(
            $insert,
            undef,
            $phone,
            $id,
        );

        my $session = Tropo::RestAPI::Session->new(
            url => 'https://tropo.developergarden.com/api/',
        );

        my $data    = $session->create(
            token        => $token,
            call_session => $id,
        ) or $self->app->log->error( $session->err );

        $self->stash( WILL_CALL => 1 );
    }

    $self->render( 'form' );
};

# called by tropo server
# deliver the json with instructions
# for tropo
any '/tropo/' => sub {
    my $self = shift;

    my $tropo_data = $self->req->json;
    my $session    = $tropo_data->{session}->{parameters}->{call_session};

    my $select = 'SELECT * FROM calls '
        . ' WHERE session = ?';
    my $sth    = $self->db->prepare(
        $select,
    );

    $sth->execute( $session );
    my $result = $sth->fetchall_arrayref({});

    my $data = {};

    if ( !$result || !$result->[0] ) {
        $result->[0]->{phone} = '+491804100100';
    }
    if ( $result->[0]->{phone} ) {
        my $tropo = Tropo->new;
        $tropo->call( $result->[0]->{phone} );
        $tropo->say(
            'your authentication code is ' . sprintf "%d", int rand (999)
        );
        $data = $tropo->perl;
    }

    $self->render( json => $data );
};

app->start;

__DATA__
@@ form.html.ep
<% if ( $WILL_CALL ) { %>
<span style="background-color: green">We will call you in a moment</span>
<% } %>
<form action="" method="post">
    Your phone number (international format, e.g. +4912345678):
    <input type="text" name="phone" /><br />
    <button type="submit" value="Call me!">Call me!</button>
</form>