package Devscripts::Uscan::Templates::Github;

use strict;

sub transform {
    my $watchSource = shift;
    delete $watchSource->{template};
    my $owner          = delete $watchSource->{owner};
    my $project        = delete $watchSource->{project};
    my $dist           = delete $watchSource->{dist};
    my $custom_version = delete $watchSource->{customversion} || '';
    my $version_regexp = $custom_version || $watchSource->{versiontype};
    my ($api_dist, $std_dist);

    $watchSource->{searchmode} ||= 'plain';
    $watchSource->{pgpmode}    ||= 'none';

    # --- Default values for the general case ---
    my $api_base = "https://api.github.com/repos";
    my $std_base = "https://github.com";

    if ($owner and $project) {
        $api_dist = "$api_base/$owner/$project";
        $std_dist = "$std_base/$owner/$project";
    } elsif ($dist) {
        $std_dist = $dist;
        $api_dist = $dist;
        $api_dist =~ s#^.*?github\.com#https://api.github.com/repos#;
        $std_dist =~ s/\.git$//;
        $api_dist =~ s/\.git$//;
    } else {
        die 'Missing Owner/Project or Dist';
    }

    my $release_source = "$api_dist/releases";
    my $tags_source    = "$api_dist/git/matching-refs/tags";

    my $release_matching_pattern
      = "$api_base/[^/]+/[^/]+/tarball/"
      . '(?>[^/]+(?<=(?:\D|alpha|beta|rc))\-)?'
      . $version_regexp
      . '(?:(?=")|$)';
    my $tags_matching_pattern
      = "$api_base/[^/]+/[^/]+/git/refs/tags/"
      . '(?>[^/]+(?<=(?:\D|alpha|beta|rc))\-)?'
      . $version_regexp
      . '(?:(?=")|$)';

    my $downloadurlmangle
      = 's%(api.github.com/repos/[^/]+/[^/]+)/git/refs/%$1/tarball/refs/%g';

    my $component_filenamemangle
      = 's%.*/(?:[^/]+(?<=(?:\D|alpha|beta|rc))\-)?'
      . $version_regexp
      . '%@PACKAGE@-@COMPONENT@-$1.tar.gz%';
    my $nocomponent_filenamemangle
      = 's%.*/(?:[^/]+(?<=(?:\D|alpha|beta|rc))\-)?'
      . $version_regexp
      . '%@PACKAGE@-$1.tar.gz%';

    # --- Fine tune some special cases ---
    $watchSource->{mode} ||= "git"
      if ($watchSource->{pgpmode} eq 'gittag');

    if ($watchSource->{mode} eq 'git') {
        $release_source           = $tags_source = "$std_dist";
        $release_matching_pattern = $tags_matching_pattern
          = "refs/tags/$version_regexp";
        $nocomponent_filenamemangle = '';
        $component_filenamemangle   = '';
    } elsif ($watchSource->{pgpmode} eq 'auto') {
        $release_matching_pattern
          = "$std_dist/releases/download/$version_regexp"
          . '/[^/]+@ARCHIVE_EXT@';
    }

    # --- And now final assignations ---
    $watchSource->{source} ||= (
          $watchSource->{releaseonly}
        ? $release_source
        : $tags_source
    );
    $watchSource->{matchingpattern} ||= (
          $watchSource->{releaseonly}
        ? $release_matching_pattern
        : $tags_matching_pattern
    );
    $watchSource->{downloadurlmangle} ||= $downloadurlmangle;
    $watchSource->{filenamemangle}    ||= (
          $watchSource->{component}
        ? $component_filenamemangle
        : $nocomponent_filenamemangle
    );
    return $watchSource;
}

1;
