package Text::MustacheTemplate::Generator;
use strict;
use warnings;

use Text::MustacheTemplate::Lexer qw/:types/;

sub generate_from_tokens {
    my ($class, @tokens) = @_;

    my ($open_delimiter, $close_delimiter) = do {
        my $token = shift @tokens;
        die 'first token must be delimiter' if $token->[0] != TOKEN_DELIMITER; # uncoverable branch true
        @$token[3,4];
    };

    my $buf = '';
    for my $token (@tokens) {
        my ($type) = @$token;
        if ($type == TOKEN_RAW_TEXT) { # uncoverable branch false count:4
            my (undef, undef, $text) = @$token;
            $buf .= $text;
        } elsif ($type == TOKEN_PADDING) {
            my (undef, undef, $padding) = @$token;
            $buf .= $padding;
        } elsif ($type == TOKEN_TAG) {
            if (@$token == 3) { # uncoverable branch false count:2
                my (undef, undef, $body) = @$token;
                $buf .= $open_delimiter.$body.$close_delimiter;
            } elsif (@$token == 4) {
                my (undef, undef, $tag_type, $body) = @$token;
                $buf .= $open_delimiter.$tag_type.$body;
                $buf .= '}' if $tag_type eq '{';
                $buf .= $close_delimiter;
            } else {
                die "Unknown tag token size: ".scalar(@$token); # uncoverable statement
            }
        } elsif ($type == TOKEN_DELIMITER) {
            my (undef, undef, $body, $new_open_delimiter, $new_close_delimiter) = @$token;
            $buf .= $open_delimiter.'='.$body.'='.$close_delimiter;
            ($open_delimiter, $close_delimiter) = ($new_open_delimiter, $new_close_delimiter);
        } else {
            die "Unknown token type: $type"; # uncoverable statement
        }
    }
    return $buf;
}

1;

=encoding utf-8

=head1 NAME

Text::MustacheTemplate::Generator - Template generator for Mustache templates

=head1 SYNOPSIS

    use Text::MustacheTemplate::Lexer;
    use Text::MustacheTemplate::Generator;

    my @tokens = Text::MustacheTemplate::Lexer->tokenize('Hello {{name}}!');
    my $regenerated_template = Text::MustacheTemplate::Generator->generate_from_tokens(@tokens);
    
    # Result: 'Hello {{name}}!'

=head1 DESCRIPTION

Text::MustacheTemplate::Generator can regenerate a Mustache template from tokens.
This is primarily used for lambda functions that need access to the raw template string.

This is a low-level interface for Text::MustacheTemplate.
The APIs may change without notice.

=head1 METHODS

=over 4

=item generate_from_tokens($delimiter_token, @tokens)

Regenerates a Mustache template string from lexer tokens.

Parameters:
=over 8
=item $delimiter_token - The delimiter token containing open/close delimiters
=item @tokens - Array of tokens from Text::MustacheTemplate::Lexer
=back

Returns a string containing the regenerated template.

=back

=head1 LICENSE

Copyright (C) karupanerura.

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=head1 AUTHOR

karupanerura E<lt>karupa@cpan.orgE<gt>

=cut