package WebService::Hexonet::Connector::ResponseParser;

use 5.026_000;
use strict;
use warnings;

use version 0.9917; our $VERSION = version->declare('v2.9.2');


sub parse {
    my $response = shift;
    my %hash     = ();
    $response =~ s/\r\n/\n/gmsx;
    foreach ( split /\n/msx, $response ) {
        if (/^([^\=]*[^\t\= ])[\t ]*=[\t ]*(.+)/msx) {
            my $attr  = $1;
            my $value = $2;
            $value =~ s/[\t ]*$//msx;
            if ( $attr =~ /^property\[([^\]]*)\]/imsx ) {
                if ( !defined $hash{PROPERTY} ) {
                    $hash{PROPERTY} = {};
                }
                my $prop = uc $1;
                $prop =~ s/\s//ogmsx;
                if ( defined $hash{PROPERTY}{$prop} ) {
                    push @{ $hash{PROPERTY}{$prop} }, $value;
                } else {
                    $hash{PROPERTY}{$prop} = [ $value ];
                }
            } else {
                $hash{ uc $attr } = $value;
            }
        }
    }
    return \%hash;
}


sub serialize {
    my $h     = shift;
    my $plain = '[RESPONSE]';
    if ( defined $h->{PROPERTY} ) {
        my $props = $h->{PROPERTY};
        foreach my $key ( sort keys %{$props} ) {
            my $i = 0;
            foreach my $val ( @{ $props->{$key} } ) {
                $plain .= "\r\nPROPERTY[${key}][${i}]=${val}";
                $i++;
            }
        }
    }
    if ( defined $h->{CODE} ) {
        $plain .= "\r\nCODE=" . $h->{CODE};
    }
    if ( defined $h->{DESCRIPTION} ) {
        $plain .= "\r\nDESCRIPTION=" . $h->{DESCRIPTION};
    }
    if ( defined $h->{QUEUETIME} ) {
        $plain .= "\r\nQUEUETIME=" . $h->{QUEUETIME};
    }
    if ( defined $h->{RUNTIME} ) {
        $plain .= "\r\nRUNTIME=" . $h->{RUNTIME};
    }
    $plain .= "\r\nEOF\r\n";
    return $plain;
}

1;

__END__

=pod

=head1 NAME

WebService::Hexonet::Connector::ResponseParser - Library that provides functionality to parse
plain-text API response data into Hash format and to serialize it back to plain-text format
if necessary.

=head1 SYNOPSIS

This module is internally used by the WebService::Hexonet::Connector::Response module.
To be used in the way:

    # specify the API plain-text response (this is just an example that won't fit to the command above)
    $plain = "[RESPONSE]\r\nCODE=200\r\nDESCRIPTION=Command completed successfully\r\nEOF\r\n";

    # parse a plain-text response into hash
    $hash = WebService::Hexonet::Connector::ResponseParser::parse($plain);

    # serialize that hash format back to plain-text
    $plain = WebService::Hexonet::Connector::ResponseParser::serialize($hash);

=head1 DESCRIPTION

HEXONET Backend API always responds in plain-text format that needs to get parsed into a useful data structure.
Within automated tests we also need the reverse way to serialize a parsed response back to plain-text.
This module cares about exactly all that.


=head2 Methods

=over

=item C<parse( $plain )>

Returns the parsed API response as Hash.
Specifiy the plain-text API response as $plain.

=item C<serialize( $hash )>

Returns the serialized API response as string. 
Specifiy the hash notation of the API response as $hash.

=back

=head1 LICENSE AND COPYRIGHT

This program is licensed under the L<MIT License|https://raw.githubusercontent.com/hexonet/perl-sdk/master/LICENSE>.

=head1 AUTHOR

L<HEXONET GmbH|https://www.hexonet.net>

=cut