#!perl -T
use strict;
use warnings;

use Test::More tests => 85;

BEGIN { use_ok('Email::ARF::Report'); }

my %code;

$code{string} = sub {
  my ($filename) = @_;
  open my $fh, '<', "t/messages/$filename.msg" or die "couldn't read file: $!";
  my $content = do { local $/; <$fh> };
  my $report = Email::ARF::Report->new($content);

  ok(
    $report->as_string eq $content,
    "string: $filename: report stringifies to content",
  );

  ok(
    $report->as_email->as_string eq $content,
    "string: $filename: report stringifies to content",
  );

  return $report;
};

$code{str_ref} = sub {
  my ($filename) = @_;
  open my $fh, '<', "t/messages/$filename.msg" or die "couldn't read file: $!";
  my $content = do { local $/; <$fh> };
  my $copy    = $content;
  my $report = Email::ARF::Report->new(\$content);

  ok(
    $report->as_string eq $copy,
    "str_ref: $filename: report stringifies to content",
  );

  ok(
    $report->as_email->as_string eq $copy,
    "str_ref: $filename: report stringifies to content",
  );

  return $report;
};

$code{object} = sub {
  my ($filename) = @_;
  open my $fh, '<', "t/messages/$filename.msg" or die "couldn't read file: $!";
  my $content = do { local $/; <$fh> };
  my $mime = Email::MIME->new($content);
  my $report = Email::ARF::Report->new($mime);

  ok(
    $report->as_string eq $content,
    "object: $filename: report stringifies to content",
  );

  ok(
    $report->as_email->as_string eq $content,
    "object: $filename: report stringifies to content",
  );

  return $report;
};

my %data = (
  example0 => { 'feedback-type' => 'abuse'   },
  example1 => { 'feedback-type' => 'opt-out' },
  example2 => { 'feedback-type' => 'abuse', 'source-ip' => '10.67.41.167' },
);

for my $code (keys %code) {
  while (my ($file, $attr) = each %data) {
    my $desc = "$file: $code";

    my $report = $code{$code}->($file);
    isa_ok($report, 'Email::ARF::Report');

    is(
      $report->feedback_type,
      $attr->{'feedback-type'},
      "$desc: feedback_type"
    );

    is($report->user_agent,  'SomeGenerator/1.0', "$desc: user_agent");
    is($report->arf_version, '0.1',               "$desc: arf_version");

    for my $field (keys %$attr) {
      is($report->field($field), $attr->{$field}, "$desc: $field");
    }

    is(
      $report->original_email->header('subject'),
      'Earn money',
      "$desc: we can get headers from the original message via the report",
    );

    like(
      $report->description,
      qr/\QIP 10.67.41.167\E/,
      "$desc: we seem to be able to get the report description",
    );
  }
}
