#! /usr/bin/perl
#---------------------------------------------------------------------

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

use Dist::Zilla::Tester;

#---------------------------------------------------------------------
# Fake execution of VCS commands:

use Dist::Zilla::Plugin::Repository;    # make sure it's already loaded
use File::Temp qw/tempdir/;
local $ENV{HOME} = tempdir(CLEANUP => 1);

my %result;

{

    package Dist::Zilla::Plugin::Repository;
    no warnings 'redefine';

    sub _execute {
        my $cmd = shift;
        $result{$cmd} || die "Unexpected command <$cmd>";
    }
}

my %remotes = (
    origin    => 'git@github.com:fayland/dist-zilla-plugin-repository.git',
    dzil      => 'git://github.com/rjbs/dist-zilla.git',
    bitbucket => 'git@bitbucket.org:foo/bar',
    codeberg  => 'ssh://git@codeberg.org/foo/bar.git',
    gitlab    => 'git@gitlab.com:foo/bar',
    github    => 'git@github.com:foo/bar',
    work      => 'work',
    nourl     => 'origin',
);

foreach (keys %remotes) {
    $result{"git config --get remote.$_.url"} = $remotes{$_};
}

$result{'svn info'} = <<'END SVN';
Path: .
URL: http://example.com/svn/trunk/my-project
Repository Root: http://example.com/svn
Repository UUID: 12345678-9012-3456-7890-123456789012
Revision: 1234
Node Kind: directory
Schedule: normal
Last Changed Author: example
Last Changed Rev: 1234
Last Changed Date: 2008-09-27 15:42:32 -0500 (Sat, 27 Sep 2008)
END SVN

$result{'darcs query repo'} = <<'END DARCS';
          Type: darcs
        Format: darcs-1.0
          Root: /home/user/foobar
      Pristine: PlainPristine "_darcs/pristine"
         Cache: thisrepo:/home/user/foobar
Default Remote: http://example.com/darcs
   Num Patches: 2
END DARCS

$result{'hg paths'} = <<'END HG';
default = https://foobar.googlecode.com/hg/
END HG

#---------------------------------------------------------------------
sub make_ini {
    my $ini = <<'END START';
name     = DZT-Sample
author   = E. Xavier Ample <example@example.org>
license  = Perl_5
copyright_holder = E. Xavier Ample
version  = 0.01

[GatherDir]
[Repository]
END START

    $ini . join('', map { "$_\n" } @_);
}    # end make_ini

#---------------------------------------------------------------------
sub build_tzil {
    my $repo = shift || [];

    my @extra_files;
    while (@_) {
        push @extra_files, "source/" . shift;
        push @extra_files, @_ ? shift : '';
    }

    my $tzil = Builder->from_config(
        {dist_root => 't/corpus/DZT'},
        {
            add_files => {
                'source/dist.ini' => make_ini(@$repo),
                @extra_files,
            },
        },
    );

    $tzil->build;

    return $tzil;
}    # end build_tzil

#---------------------------------------------------------------------
sub github_deprecated {
    scalar grep { /github_http is deprecated/ } @{shift->log_messages};
}    # end github_deprecated

#---------------------------------------------------------------------
sub remote_not_found {
    scalar grep { /Skipping invalid git remote/ } @{shift->log_messages};
}    # end remote_not_found

#=====================================================================
{
    my $tzil = build_tzil();

    is($tzil->distmeta->{resources}{repository}, undef, "No repository");
    ok(!github_deprecated($tzil), "No repository log message");
}

#---------------------------------------------------------------------
{
    my $url = 'http://example.com';

    my $tzil = build_tzil(["repository = $url"]);

    is_deeply($tzil->distmeta->{resources}{repository}, {url => $url}, "Just a URL");
    ok(!github_deprecated($tzil), "Just a URL log message");
}

#---------------------------------------------------------------------
{
    my $url = 'http://example.com/svn/repo';

    my $tzil = build_tzil(["repository = $url", 'type = svn']);

    is_deeply($tzil->distmeta->{resources}{repository}, {url => $url, type => 'svn'}, "SVN with type");
    ok(!github_deprecated($tzil), "SVN with type log message");
}

#---------------------------------------------------------------------
{
    my $url = 'http://example.com/svn/repo';
    my $web = 'http://example.com';

    my $tzil = build_tzil(["repository = $url", "web = $web", 'type = svn']);

    is_deeply($tzil->distmeta->{resources}{repository}, {web => $web, url => $url, type => 'svn'}, "SVN with type and web");
    ok(!github_deprecated($tzil), "SVN with type and web log message");
}

#---------------------------------------------------------------------
{
    my $tzil = build_tzil([], '.git');

    is_deeply(
        $tzil->distmeta->{resources}{repository},
        {
            type => 'git',
            url  => 'git://github.com/fayland/dist-zilla-plugin-repository.git',
            web  => 'https://github.com/fayland/dist-zilla-plugin-repository'
        },
        "Auto github"
    );
    ok(!github_deprecated($tzil), "Auto github log message");
}

#---------------------------------------------------------------------
{
    my $tzil = build_tzil(['github_http = 1'], '.git');

    is_deeply(
        $tzil->distmeta->{resources}{repository},
        {
            type => 'git',
            web  => 'https://github.com/fayland/dist-zilla-plugin-repository'
        },
        "Auto github with http"
    );
    ok(github_deprecated($tzil), "Auto github with http log message");
}

#---------------------------------------------------------------------
{
    my $tzil = build_tzil(['github_http = 0'], '.git');

    is_deeply(
        $tzil->distmeta->{resources}{repository},
        {
            type => 'git',
            url  => 'git://github.com/fayland/dist-zilla-plugin-repository.git',
            web  => 'https://github.com/fayland/dist-zilla-plugin-repository'
        },
        "Auto github no http"
    );
    ok(!github_deprecated($tzil), "Auto github no http log message");
}

#---------------------------------------------------------------------
{
    my $tzil = build_tzil(['git_remote = dzil', 'github_http = 1'], '.git');

    is_deeply(
        $tzil->distmeta->{resources}{repository},
        {
            type => 'git',
            web  => 'https://github.com/rjbs/dist-zilla'
        },
        "Auto github remote dzil with github_http"
    );
    ok(github_deprecated($tzil), "Auto github remote dzil with github_http log message");
}

#---------------------------------------------------------------------
{
    my $tzil = build_tzil(['git_remote = dzil'], '.git');

    is_deeply(
        $tzil->distmeta->{resources}{repository},
        {
            type => 'git',
            url  => 'git://github.com/rjbs/dist-zilla.git',
            web  => 'https://github.com/rjbs/dist-zilla'
        },
        "Auto github remote dzil no http"
    );
    ok(!github_deprecated($tzil), "Auto github remote dzil no http log message");
}

#---------------------------------------------------------------------
{
    my $tzil = build_tzil(['git_remote = gitlab'], '.git');

    is_deeply(
        $tzil->distmeta->{resources}{repository},
        {
            type => 'git',
            url  => 'git://gitlab.com/foo/bar',
            web  => 'https://gitlab.com/foo/bar'
        },
        "Auto gitlab"
    );
    ok(!github_deprecated($tzil), "Auto gitlab log message");
}

#---------------------------------------------------------------------
{
    my $tzil = build_tzil(['git_remote = bitbucket'], '.git');

    is_deeply(
        $tzil->distmeta->{resources}{repository},
        {
            type => 'git',
            url  => 'git://bitbucket.org/foo/bar',
            web  => 'https://bitbucket.org/foo/bar'
        },
        "Auto bitbucket"
    );
    ok(!github_deprecated($tzil), "Auto bitbucket log message");
}

#---------------------------------------------------------------------
{
    my $tzil = build_tzil([], '.svn');

    is_deeply(
        $tzil->distmeta->{resources}{repository},
        {
            type => 'svn',
            url  => 'http://example.com/svn/trunk/my-project'
        },
        "Auto svn"
    );
    ok(!github_deprecated($tzil), "Auto svn log message");
}

#---------------------------------------------------------------------
{
    my $web = 'http://example.com';

    my $tzil = build_tzil(["web = $web"], '.svn');

    is_deeply(
        $tzil->distmeta->{resources}{repository},
        {
            type => 'svn',
            web  => $web,
            url  => 'http://example.com/svn/trunk/my-project'
        },
        "Auto svn with web"
    );
    ok(!github_deprecated($tzil), "Auto svn with web log message");
}

#---------------------------------------------------------------------
{
    my $tzil = build_tzil([], '_darcs');

    is_deeply(
        $tzil->distmeta->{resources}{repository},
        {
            type => 'darcs',
            url  => 'http://example.com/darcs'
        },
        "Auto darcs from default remote"
    );
    ok(!github_deprecated($tzil), "Auto darcs from default remote log message");
}

#---------------------------------------------------------------------
{
    my $url = 'http://example.com/darcs/fromprefs';

    # Munge the Default Remote so it's not http:
    local $result{'darcs query repo'} = $result{'darcs query repo'};
    $result{'darcs query repo'} =~ s!Remote: http!Remote: ssh!;

    my $tzil = build_tzil([], '_darcs/prefs/repos' => "ssh:foo\n$url\n");

    is_deeply($tzil->distmeta->{resources}{repository}, {type => 'darcs', url => $url}, "Auto darcs from prefs/repos");
    ok(!github_deprecated($tzil), "Auto darcs from prefs/repos log message");
}

#---------------------------------------------------------------------
{
    my $tzil = build_tzil([], '.hg');

    is_deeply($tzil->distmeta->{resources}{repository}, {type => 'hg', url => 'https://foobar.googlecode.com/hg/'}, "Auto hg");
    ok(!github_deprecated($tzil), "Auto hg log message");
}

#---------------------------------------------------------------------
{
    my $web  = 'http://code.google.com/p/foobar/';
    my $tzil = build_tzil(["web = $web"], '.hg');

    is_deeply(
        $tzil->distmeta->{resources}{repository},
        {
            type => 'hg',
            web  => $web,
            url  => 'https://foobar.googlecode.com/hg/'
        },
        "Auto hg with web"
    );
    ok(!github_deprecated($tzil), "Auto hg with web log message");
}

#---------------------------------------------------------------------
{
    my $tzil = build_tzil(['git_remote = nourl'], '.git');

    is($tzil->distmeta->{resources}{repository}, undef, "Auto git remote nourl");
    ok(!github_deprecated($tzil), "Auto git remote nourl log message");
}

{
    my $url  = 'git://example.com/example.git';
    my $tzil = build_tzil(['git_remote = nourl', "repository = $url"], '.git');

    is_deeply(
        $tzil->distmeta->{resources}{repository},
        {type => 'git', url => $url, web => 'https://example.com/example'},
        "Auto git remote nourl with repository"
    );
    ok(!github_deprecated($tzil), "Auto git remote nourl with repository log message");
}

{
    my $tzil = build_tzil(['git_remote = work'], '.git');

    is($tzil->distmeta->{resources}{repository}, undef, "Auto git remote work not found");
    ok(!remote_not_found($tzil), "Auto git remote work not found");
}

#---------------------------------------------------------------------
{
    my $tzil = build_tzil(['repository = git@gitlab.com:foo/bar.git'], '.git');

    is_deeply(
        $tzil->distmeta->{resources}{repository},
        {
            type => 'git',
            url  => 'git://gitlab.com/foo/bar.git',
            web  => 'https://gitlab.com/foo/bar'
        },
        "Auto gitlab"
    );
    ok(!github_deprecated($tzil), "Auto gitlab log message");
}

{
    my $tzil = build_tzil(['repository = git@codeberg.org:foo/bar.git'], '.git');

    is_deeply(
        $tzil->distmeta->{resources}{repository},
        {
            type => 'git',
            url  => 'git://codeberg.org/foo/bar.git',
            web  => 'https://codeberg.org/foo/bar'
        },
        "Auto codeberg"
    );
    ok(!github_deprecated($tzil), "Auto codeberg log message");
}
done_testing;
