The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Zonemaster::GUI::Dancer::Frontend;

use 5.14.2;
use warnings;

use Encode qw[decode_utf8];

our $VERSION = '1.0.7';

###
### Fetch the FAQ source documents
###

use Text::Markdown 'markdown';
use HTTP::Tiny;

my $faq_url_base = 'https://raw.githubusercontent.com/dotse/zonemaster-gui/master/docs/FAQ/gui-faq-%s.md';
my %faqs;
my $http = HTTP::Tiny->new;
for my $lang ( qw[sv en fr da] ) {
    my $r = $http->get( sprintf( $faq_url_base, $lang ) );
    if ( $r->{success} and $r->{headers}{'content-type'} eq 'text/plain; charset=utf-8' ) {
        $faqs{$lang} = markdown( decode_utf8( $r->{content} ) );
        $faqs{$lang} =~ s/<a/<a style="color: white;"/isg;
        $faqs{$lang} =~ s/<h4/<br><h4/isg;
    }
    elsif ( $r->{success} ) {
        $faqs{$lang} = 'Unexpected content-type for FAQ: ' . $r->{headers}{'content-type'};
    }
    else {
        $faqs{$lang} = 'FAQ content missing.';
    }
}

###
### Proceed with Dancer stuff
###

use Dancer ':syntax';
use Zonemaster::GUI::Dancer::Client;

my $backend_port = 5000;
$backend_port = $ENV{ZONEMASTER_BACKEND_PORT} if ($ENV{ZONEMASTER_BACKEND_PORT});
my $url = "http://localhost:$backend_port";
my $client = Zonemaster::GUI::Dancer::Client->new( { url => $url } );
set logger => 'console';

set logger => 'console';

get '/' => sub {
    template 'index';
};

get '/test/:id' => sub {
    my $lang = request->{'accept_language'};
    $lang =~ s/,.*$//;
    my $result = $client->get_test_results( { params, language => $lang } );
    template 'index', { test_id => param( 'id' ) };
};

get '/parent' => sub {
    my $result = $client->get_data_from_parent_zone( param( 'domain' ) );
    content_type 'application/json';
    return to_json( { result => $result } );
};

sub get_ip {
    my $ip = request->address;
    $ip = request->header('X-Forwarded-For') if (($ip =~ /127\.0\.0\.1/ || $ip =~ /::1/) && request->header('X-Forwarded-For'));
    $ip =~ s/::ffff:// if ( $ip =~ /::ffff:/ );
    
    return $ip;
}

get '/version' => sub {
    my $data = $client->version_info( {} );
    my $ip = get_ip();
    content_type 'application/json';
    my $version;
    if ($ENV{ZONEMASTER_ENVIRONMENT}) {
		$version = $ENV{ZONEMASTER_ENVIRONMENT}." [Engine:".$data->{zonemaster_engine} . " / Frontend:$VERSION / Backend:".$data->{zonemaster_backend} . " / IP address: $ip]";
	}
	else {
		$version = "Zonemaster Test Engine Version:".$data->{zonemaster_engine} . ", IP address: $ip";
	}
	
    return to_json( { result => $version } );
};

get '/check_syntax' => sub {
    my $data = from_json( param( 'data' ), { utf8 => 0 } );
    my $result = $client->validate_syntax( {%$data} );
    content_type 'application/json';
    return to_json( { result => $result } );
};

get '/history' => sub {
    my $data = from_json( param( 'data' ), { utf8 => 0 } );
    my $result = $client->get_test_history( { frontend_params => {%$data}, limit => 200, offset => 0 } );
    content_type 'application/json';
    return to_json( { result => $result } );
};

get '/resolve' => sub {
    my $data   = param( 'data' );
    my $result = $client->get_ns_ips( $data );
    content_type 'application/json';
    return to_json( { result => $result } );
};

post '/run' => sub {
    my $data = from_json( param( 'data' ), { utf8 => 0 } );
    $data->{client_id}      = 'Zonemaster Dancer Frontend';
    $data->{client_version} = __PACKAGE__->VERSION;

    $data->{user_ip} = get_ip();
    
    my $job_id = $client->start_domain_test( {%$data} );
    content_type 'application/json';
    return to_json( { job_id => $job_id } );
};

get '/progress' => sub {
    my $progress = $client->test_progress( param( 'id' ) );
    header( 'Cache-Control' => 'no-store, no-cache, must-revalidate' );
    content_type 'application/json';
    return to_json( { progress => $progress } );
};

get '/result' => sub {
    my $result = $client->get_test_results( {params} );
    content_type 'application/json';
    return to_json( { result => $result } );
};

get '/faq' => sub {
    return to_json( { FAQ_CONTENT => $faqs{ param('lang') } } );
};

true;