#!/usr/bin/perl

# Copyright © 2022 Felix Lechner <felix.lechner@lease-up.com>
#
# based on a shell script by the same name
#     Arjan Oosting <arjan@debian.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

use v5.20;
use warnings;
use utf8;

use Const::Fast;
use List::SomeUtils qw(uniq);
use Path::Tiny;
use Unicode::UTF8 qw(encode_utf8);

use Debian::Debhelper::Buildsystem::Haskell::Recipes qw(
  run
  init_hs_env
  installable_hc
  installable_type
  ghc_pkg_command
  load_ghc_database
  own_cabal_prerequisites
);
use Debian::Debhelper::Dh_Lib;

const my $EMPTY => q{};
const my $SPACE => q{ };
const my $COMMA => q{,};

const my $NEWLINE => qq{\n};

init(
    options => {
        'type=s' => \$dh{TYPE},
    });
init_hs_env();

# this installs the extra-packages file
if (length $ENV{DEB_GHC_EXTRA_PACKAGES}) {

    die encode_utf8('Need CABAL_PACKAGE for DEB_GHC_EXTRA_PACKAGES')
      unless length $ENV{CABAL_PACKAGE};

    die encode_utf8('Need CABAL_VERSION for DEB_GHC_EXTRA_PACKAGES')
      unless length $ENV{CABAL_VERSION};

    for my $installable (@{ $dh{DOPACKAGES} }) {

        my $type = $dh{TYPE} // installable_type($installable);
        next if ($type ne 'dev');

        my $EP_DIR
          = "debian/$installable/usr/lib/haskell-packages/extra-packages";
        run(qw{mkdir --parents}, $EP_DIR);

        path("$EP_DIR/$ENV{CABAL_PACKAGE}-$ENV{CABAL_VERSION}")
          ->spew_utf8($ENV{DEB_GHC_EXTRA_PACKAGES});
    }
}

# and that consumes it
for my $installable (@{ $dh{DOPACKAGES} }) {

    my $compiler = installable_hc($installable) || $ENV{DEB_DEFAULT_COMPILER};

    my @extra_depends;

    my @hashed_ids= own_cabal_prerequisites($compiler, $ENV{DEB_GHC_DATABASE});
    for my $hashed_id (@hashed_ids) {

        next
          unless $hashed_id =~ m{^ ([^-]+) - ([0-9.]+) - [0-9a-f]{32} $}x;

        my $name = $1;
        my $version = $2;

        my $extra_packages_file
          = "/usr/lib/haskell-packages/extra-packages/$name-$version";

        push(@extra_depends,
            split(m{ \s* , \s* }x, path($extra_packages_file)->slurp_utf8))
          if -e $extra_packages_file;
    }

    my $substvars_path = "debian/$installable.substvars";

    # fix sort order
    local $ENV{LC_ALL} = 'C.UTF-8';

    replace_line($substvars_path, 'haskell:Extra-Depends',
        join($COMMA . $SPACE, (sort +uniq @extra_depends)));
}

exit;

sub replace_line {
    my ($path, $field, $value) = @_;

    $value //= $EMPTY;

    path($path)->touch;

    my @lines = grep { !m{^ $field = }x } path($path)->lines_utf8;

    push(@lines, "$field=$value" . $NEWLINE);

    path($path)->spew_utf8(@lines);

    return;
}

=head1 NAME

dh_haskell_extra_depends_ghc - store Haskell compiler info in substvars

=head1 SYNOPSIS

B<dh_haskell_extra_depends_ghc> [S<I<debhelper options>>]

=head1 DESCRIPTION

dh_haskell_extra_depends_ghc is a Debhelper program that Debian prerequisites for Haskell programs and libraries.

You can use it like this: C<${haskell:Depends}>

This script writes the debian/$package.substvars file, including in it the
haskell:Depends variable.  So, to use this package, include in the Depends:
field in debian/control ${haskell:Depends}.

=head1 SEE ALSO

L<debhelper(7)>

=head1 AUTHOR

John Goerzen <jgoerzen@complete.org>

Based on ideas in dh_python by Josselin Mouette <joss@debian.org>

=cut

# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
