use strict;
use warnings;
use Plack::Builder;

builder {
    enable 'DevFilter',
        filters => [
            {
                match => sub {
                    my ($self, $env, $res) = @_;
                    return 1 if $env->{PATH_INFO} eq '/favicon.ico';
                },
                proc  => sub {
                    my ($self, $env, $res,
                            $body_ref, $imager, $image_type) = @_;
                    if ($imager) {
                        $imager = $imager->convert(preset => 'gray')
                                        or die Imager->errstr;
                        my $out;
                        $imager->write(data => \$out, type => $image_type);
                        $res->[2] = [$out];
                    }
                },
            },
            {
                match => sub {
                    my ($self, $env, $res) = @_;
                    return 1 if $env->{PATH_INFO} eq '/';
                },
                proc  => sub {
                    my ($self, $env, $res,
                            $body_ref, $imager, $image_type) = @_;
                    $$body_ref .= ' How are you?';
                    $res->[2] = [$$body_ref];
                },
            },
            {
                match => sub {
                    my ($self, $env, $res) = @_;
                    return 1 if $env->{PATH_INFO} eq '/style.css';
                },
                proc  => sub {
                    my ($self, $env, $res,
                            $body_ref, $imager, $image_type) = @_;
                    $$body_ref =~ s/#ffffff/#ffffcc/g;
                    $res->[2] = [$$body_ref];
                },
            },
        ],
    ;

    enable 'Static',
        path => qr{\.(?:ico|css|png|gif|jpeg)$},
        root => 'share',
    ;

    return sub {
        my $plack_env = $ENV{PLACK_ENV} || '';
        [200, ['Content-Type' => 'text/plain'], ["Hello, $plack_env!"]];
    };
};