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

use Test::DZil;

sub test_this {
  my ($plugins, $add_files, $assertion) = @_;

  my $tzil = Builder->from_config(
    { dist_root => 'corpus/dist/DZT' },
    {
      add_files => {
        'source/dist.ini' => simple_ini(
          'GatherDir',
          @$plugins,
          [ Prereqs => { 'Foo::Bar' => '1.20' } ],
          [ Prereqs => BuildRequires => { 'Builder::Bob' => '9.901' } ],
          [ Prereqs => TestRequires  => { 'Test::Deet'   => '7'     } ],
        ),
        %$add_files,
      },
    },
  );

  $tzil->build;

  $assertion->($tzil);
}

# ShareDir

test_this(
  [ qw(MakeMaker) ],
  { },
  sub {
    my $tzil = shift;
    my $makefile = $tzil->slurp_file('build/Makefile.PL');
    unlike($makefile, qr/install_share dist => .share./, "not going to install share");
  },
);

test_this(
  [ qw(MakeMaker ShareDir) ],
  { },
  sub {
    my $tzil = shift;
    my $makefile = $tzil->slurp_file('build/Makefile.PL');
    unlike($makefile, qr/install_share dist => .share./, "not going to install share");
  },
);


test_this(
  [ qw(MakeMaker) ],
  { 'source/share/stupid-share.txt' => "This is a sharedir file.\n" },
  sub {
    my $tzil = shift;
    my $makefile = $tzil->slurp_file('build/Makefile.PL');
    unlike(
      $makefile,
      qr/install_share dist => .share./,
      "files in ./share, but no ShareDir, so we will not install_share"
    );
  },
);

test_this(
  [ qw(MakeMaker ShareDir) ],
  { 'source/share/stupid-share.txt' => "This is a sharedir file.\n" },
  sub {
    my $tzil = shift;
    my $makefile = $tzil->slurp_file('build/Makefile.PL');
    like(
      $makefile,
      qr/install_share dist => .share./,
      "files in ./share, ShareDir, so we will install_share"
    );
  },
);

test_this(
  [ qw(ModuleBuild ShareDir) ],
  { 'source/share/stupid-share.txt' => "This is a sharedir file.\n" },
  sub {
    my $tzil = shift;
    my $modulebuild = $tzil->plugin_named('ModuleBuild');
    is(
      $modulebuild->__module_build_args->{share_dir}{dist},
      'share',
      "files in ./share, ShareDir, so we have a Build.PL share_dir"
    );
  },
);

# ModuleShareDirs

test_this(
  [ qw(MakeMaker) ],
  { },
  sub {
    my $tzil = shift;
    my $makefile = $tzil->slurp_file('build/Makefile.PL');
    unlike($makefile, qr/install_share module => .DZT::Simple., .share./,
      "not going to install module-based share"
    );
  },
);

test_this(
  [ qw(MakeMaker ModuleShareDirs) ],
  { },
  sub {
    my $tzil = shift;
    my $makefile = $tzil->slurp_file('build/Makefile.PL');
    unlike($makefile, qr/install_share module => .DZT::Simple., .share./,
      "not going to install module-based share"
    );
  },
);

test_this(
  [ qw(MakeMaker ModuleShareDirs) ],
  { 'source/share/stupid-share.txt' => "This is a sharedir file.\n" },
  sub {
    my $tzil = shift;
    my $makefile = $tzil->slurp_file('build/Makefile.PL');
    unlike($makefile, qr/install_share module => .DZT::Simple., .share./,
      "files in ./share, empty ModuleShareDirs, so we will not install_share"
    );
  },
);

test_this(
  [
    'MakeMaker',
    ['ModuleShareDirs' => { 'DZT::Simple' => 'share' } ],
  ],
  { 'source/share/stupid-share.txt' => "This is a sharedir file.\n" },
  sub {
    my $tzil = shift;
    my $makefile = $tzil->slurp_file('build/Makefile.PL');
    like($makefile, qr/install_share module => .DZT::Simple., .share./,
      "files in ./share, ModuleShareDirs given, so we will install_share"
    );
  },
);

test_this(
  [
    'MakeMaker',
    ['ModuleShareDirs' => { 'DZT::Simple' => 'share', 'DZT::Other' => 'other' } ],
  ],
  {
    'source/share/stupid-share.txt' => "This is a sharedir file.\n",
    'source/other/stupid-other.txt' => "This is another sharedir file.\n",
  },
  sub {
    my $tzil = shift;
    my $makefile = $tzil->slurp_file('build/Makefile.PL');
    like($makefile, qr/install_share module => .DZT::Simple., .share./,
      "files in ./share, ModuleShareDirs given, so we will install_share"
    );
    like($makefile, qr/install_share module => .DZT::Other., .other./,
      "files in ./other, another ModuleShareDirs given, so we will install_share"
    );
  },
);

test_this(
  [
    'MakeMaker', 'ShareDir',
    ['ModuleShareDirs' => { 'DZT::Simple' => 'simple', 'DZT::Other' => 'other' } ],
  ],
  {
    'source/share/stupid-share.txt' => "This is a sharedir file.\n",
    'source/other/stupid-other.txt' => "This is another sharedir file.\n",
    'source/simple/stupid-other.txt' => "This is another simple sharedir file.\n",
  },
  sub {
    my $tzil = shift;
    my $makefile = $tzil->slurp_file('build/Makefile.PL');
    like($makefile, qr/install_share dist => .share./,
      "ShareDir and ModuleShareDirs: dist share"
    );
    like($makefile, qr/install_share module => .DZT::Simple., .simple./,
      "ShareDir and ModuleShareDirs: first module share",
    );
    like($makefile, qr/install_share module => .DZT::Other., .other./,
      "ShareDir and ModuleShareDirs: other module share"
    );
  },
);

test_this(
  [
    'ModuleBuild',
    ['ModuleShareDirs' => { 'DZT::Simple' => 'share' } ],
  ],
  { 'source/share/stupid-share.txt' => "This is a sharedir file.\n" },
  sub {
    my $tzil = shift;
    my $modulebuild = $tzil->plugin_named('ModuleBuild');
    is(
      $modulebuild->__module_build_args->{share_dir}{module}{'DZT::Simple'},
      'share',
      "files in ./share, ModuleShareDirs given, so we have a Build.PL share_dir"
    );
  },
);

test_this(
  [
    'ModuleBuild', 'ShareDir',
    ['ModuleShareDirs' => { 'DZT::Simple' => 'simple', 'DZT::Other' => 'other' } ],
  ],
  {
    'source/share/stupid-share.txt' => "This is a sharedir file.\n",
    'source/other/stupid-other.txt' => "This is another sharedir file.\n",
    'source/simple/stupid-other.txt' => "This is another simple sharedir file.\n",
  },
  sub {
    my $tzil = shift;
    my $modulebuild = $tzil->plugin_named('ModuleBuild');
    is_deeply(
      $modulebuild->__module_build_args->{share_dir},
      {
        dist => 'share',
        module => {
          'DZT::Simple' => 'simple',
          'DZT::Other' => 'other',
        },
      },
      "ModuleBuild with ShareDir and ModuleShareDirs"
    );
  },
);

# ExecDir

test_this(
  [ qw(MakeMaker) ],
  { },
  sub {
    my $tzil = shift;
    my $makemaker = $tzil->plugin_named('MakeMaker');

    ok(
      !exists $makemaker->__write_makefile_args->{EXE_FILES},
      "not going to install execs",
    );
  },
);

test_this(
  [ qw(MakeMaker) ],
  { 'source/bin/be-stiff' => "#!perl\nuse D::Evo;\nuse B::Stuff;\n" },
  sub {
    my $tzil = shift;
    my $makemaker = $tzil->plugin_named('MakeMaker');
    ok(
      !exists $makemaker->__write_makefile_args->{EXE_FILES},
      "files in ./bin, but no ExecDir, not going to install execs",
    );
  },
);

test_this(
  [ qw(MakeMaker ExecDir) ],
  { 'source/bin/be-stiff' => "#!perl\nuse D::Evo;\nuse B::Stuff;\n" },
  sub {
    my $tzil = shift;
    my $makemaker = $tzil->plugin_named('MakeMaker');
    is_deeply(
      $makemaker->__write_makefile_args->{EXE_FILES},
      [ 'bin/be-stiff' ],
      "files in ./bin, ExecDir, going to install execs",
    );
  },
);

test_this(
  [ qw(ModuleBuild ExecDir) ],
  { 'source/bin/be-stiff' => "#!perl\nuse D::Evo;\nuse B::Stuff;\n" },
  sub {
    my $tzil = shift;
    my $modulebuild = $tzil->plugin_named('ModuleBuild');
    is_deeply(
      $modulebuild->__module_build_args->{script_files},
      [ 'bin/be-stiff' ],
      "files in ./bin, ExecDir, going to install execs in Build.PL",
    );
  },
);

done_testing;