use strict;
use warnings;
use Test::More 0.88;

use lib 't/lib';

use Test::DZil;

for my $skip_skip (0..3) {
  my $tzil = Builder->from_config(
    { dist_root => 'corpus/dist/DZT' },
    {
      add_files => {
        'source/dist.ini' => simple_ini(
          [ GatherDir => ],
          [ GatherDir => BonusFiles => {
            root   => '../corpus/extra',
            prefix => 'bonus',
          } ],
          ($skip_skip > 1 ? 'ManifestSkip' : ()),
        ),
        'source/MANIFEST.SKIP' => join('', map {; "$_\n" } (
          'dist.ini',
          '.*\.txt',
          ($skip_skip & 1 ? 'MANIFEST.SKIP' : ()),
        )),
      },
      also_copy => { 'corpus/extra' => 'corpus/extra' },
    },
  );

  $tzil->build;

  my @files = map {; $_->name } @{ $tzil->files };

  is_filelist(
    $tzil->files,
    [ qw(bonus/subdir/index.html lib/DZT/Sample.pm t/basic.t),
      ($skip_skip >= 2 ? () : ('dist.ini', 'bonus/vader.txt')),
      ($skip_skip == 3 ? () : 'MANIFEST.SKIP'),
    ],
    "ManifestSkip prunes files from MANIFEST.SKIP ($skip_skip)",
  );
}

# Test ManifestSkip with InlineFiles-generated files RT#76036
for my $skip_skip (0..1) {
  my $tzil = Builder->from_config(
    { dist_root => 'corpus/dist/DZT' },
    {
      add_files => {
        'source/dist.ini' => simple_ini(
          [ GatherDir => ],
          [ GatherDir => BonusFiles => {
            root   => '../corpus/extra',
            prefix => 'bonus',
          } ],
          'JustForManifestSkipTests',
          ($skip_skip & 1 ? [ ManifestSkip => { skipfile => 'FOO.SKIP' } ] : ()),
        ),
      },
      also_copy => { 'corpus/extra' => 'corpus/extra' },
    },
  );

  $tzil->build;

  my @files = map {; $_->name } @{ $tzil->files };

  is_filelist(
    $tzil->files,
    [ qw(bonus/subdir/index.html lib/DZT/Sample.pm t/basic.t),
      ($skip_skip & 1 ? () : (qw(foo.txt dist.ini bonus/vader.txt FOO.SKIP))),
    ],
    "ManifestSkip prunes files from generated FOO.SKIP ($skip_skip)",
  );
}

{
  my $tzil = Builder->from_config(
    { dist_root => 'corpus/dist/DZT' },
    {
      add_files => {
        'source/Build'    => "This file is cruft.\n",
        'source/dist.ini' => simple_ini('GatherDir'),
      },
    },
  );

  $tzil->build;

  my @files = map {; $_->name } @{ $tzil->files };

  is_filelist(
    [ @files ],
    [ qw(dist.ini lib/DZT/Sample.pm t/basic.t Build) ],
    "./Build is included by default...",
  );
}

{
  my $tzil = Builder->from_config(
    { dist_root => 'corpus/dist/DZT' },
    {
      add_files => {
        'source/Build'    => "This file is cruft.\n",
        'source/dist.ini' => simple_ini('GatherDir', 'PruneCruft'),
      },
    },
  );

  $tzil->build;

  my @files = map {; $_->name } @{ $tzil->files };

  is_filelist(
    [ @files ],
    [ qw(dist.ini lib/DZT/Sample.pm t/basic.t) ],
    "...but /Build is pruned by PruneCruft",
  );
}

{
  my $tzil = Builder->from_config(
    { dist_root => 'corpus/dist/DZT' },
    {
      add_files => {
        'source/Build'    => "This file is cruft.\n",
        'source/dist.ini' => simple_ini(
            'GatherDir',
            [ 'PruneCruft' => { except => 'Build' } ],
        ),
      },
    },
  );

  $tzil->build;

  my @files = map {; $_->name } @{ $tzil->files };

  is_filelist(
    [ @files ],
    [ qw(dist.ini lib/DZT/Sample.pm t/basic.t Build) ],
    "...but /Build isn't  pruned by PruneCruft if we exclude it",
  );
}

{
  my $tzil = Builder->from_config(
    { dist_root => 'corpus/dist/DZT' },
    {
      add_files => {
        'source/_Inline/foo.c'  => "This file is cruft.\n",
        'source/dist.ini' => simple_ini('GatherDir', 'PruneCruft'),
      },
    },
  );

  $tzil->build;

  my @files = map {; $_->name } @{ $tzil->files };

  is_filelist(
    [ @files ],
    [ qw(dist.ini lib/DZT/Sample.pm t/basic.t) ],
    "./_Inline/* is excluded by default...",
  );
}

{
  my $tzil = Builder->from_config(
    { dist_root => 'corpus/dist/DZT' },
    {
      add_files => {
        'source/Build'    => "This file is cruft.\n",
        'source/dist.ini' => simple_ini('GatherDir', 'PruneCruft'),
        # Make sure there are multiple files to be pruned.
        'source/DZT-Sample-1/foo' => "foo from previous build\n",
        'source/DZT-Sample-1/bar' => "bar from previous build\n",
        'source/DZT-Sample-1/baz' => "baz from previous build\n",
        'source/DZT-Sampler-1/stays' => "file stays\n",
      },
    },
  );

  $tzil->build;

  my @files = map {; $_->name } @{ $tzil->files };

  is_filelist(
    [ @files ],
    [ qw(dist.ini lib/DZT/Sample.pm t/basic.t DZT-Sampler-1/stays) ],
    "all files from previous build removed",
  );
}


for my $arg (qw(filename filenames)) {
  my $tzil = Builder->from_config(
    { dist_root => 'corpus/dist/DZT' },
    {
      add_files => {
        'source/dist.ini' => simple_ini(
          'GatherDir',
          [ PruneFiles => { $arg => 'dist.ini' } ],
        ),
      },
    },
  );

  $tzil->build;

  my @files = map {; $_->name } @{ $tzil->files };

  is_filelist(
    [ @files ],
    [ qw(lib/DZT/Sample.pm t/basic.t) ],
    "we can prune a specific file by request (arg $arg)",
  );
}

{
  my $tzil = Builder->from_config(
    { dist_root => 'corpus/dist/DZT' },
    {
      add_files => {
        'source/dist.ini' => simple_ini(
          'GatherDir',
          [ PruneFiles => { match => '^dist.ini|\.t$' } ],
        ),
      },
    },
  );

  $tzil->build;

  my @files = map {; $_->name } @{ $tzil->files };

  is_filelist(
    [ @files ],
    [ qw(lib/DZT/Sample.pm) ],
    "prune multiple files with 'match'",
  );
}

done_testing;