The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Pinwheel::Helpers::Tag;

use strict;
use warnings;

use Exporter;

require Pinwheel::Controller;
use Pinwheel::View::String;

our @ISA = qw(Exporter);
our @EXPORT_OK = qw(
    content_tag
    link_to
    link_to_if
    link_to_unless
    link_to_unless_current
);


sub content_tag
{
    my ($tag, $content, $block, $s, $key, $value);

    $tag = shift(@_);
    if (@_ && ref($_[-1]) eq 'CODE') {
        $block = pop(@_);
        $content = &$block();
        $content =~ s/^\s*(.*?)\s*$/$1/;
        $content = [$content];
    } elsif (@_ & 1) {
        $content = shift(@_);
    }

    $s = [["<$tag"]];
    while (@_ > 1) {
        $key = shift;
        $value = shift;
        if (ref($value) eq 'ARRAY') {
            $value = [grep { defined($_) && length($_) } @$value];
            $value = scalar(@$value) ? join(' ', @$value) : undef;
        }
        next if !defined($value);
        push @$s, [" $key=\""], $value, ['"'];
    }
    if (defined($content)) {
        push @$s, ['>'], $content, ["</$tag>\n"];
    } else {
        push @$s, [" />\n"];
    }
    return Pinwheel::View::String->new($s);
}

sub _link_to_href
{
    my ($route_name, $route_params);
    my ($params) = @_;

    if (scalar(@$params) > 1 and ref(@$params[1]) eq 'HASH') {
        $route_name = shift(@$params);
        $route_params = shift(@$params);
        return Pinwheel::Controller::url_for($route_name, %$route_params);
    } else {
        return shift(@$params);
    }
}

sub link_to
{
    my ($content, $href);

    $content = shift(@_);
    $href = _link_to_href(\@_);

    return content_tag('a', $content, href => $href, @_);
}

sub link_to_if
{
    my ($condition, @params) = @_;
    if ($condition) {
        return link_to(@params);
    } else {
        return $params[0];
    }
}

sub link_to_unless
{
    my ($condition, @params) = @_;
    return link_to_if(!$condition, @params);
}

sub link_to_unless_current
{
    my ($content, $href);

    $content = shift(@_);
    $href = _link_to_href(\@_);

    return link_to_unless((Pinwheel::Controller::url_for() eq $href), $content, $href, @_);
}

1;