#!/usr/bin/env perl
#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
# furnished to do so, under the terms of the COPYING file.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
# SPDX-License-Identifier: curl
#
###########################################################################

=begin comment

This script updates a curldown file to current/better curldown.

Example: cd2cd [--in-place] <file.md> > <file.md>

--in-place: if used, it replaces the original file with the cleaned up
            version. When this is used, cd2cd accepts multiple files to work
            on and it ignores errors on single files.

=end comment
=cut

my $cd2cd = "0.1"; # to keep check
my $dir;
my $extension;
my $inplace = 0;

while(1) {
    if($ARGV[0] eq "--in-place") {
        shift @ARGV;
        $inplace = 1;
    }
    else {
        last;
    }
}


use POSIX qw(strftime);
my @ts;
if (defined($ENV{SOURCE_DATE_EPOCH})) {
    @ts = localtime($ENV{SOURCE_DATE_EPOCH});
} else {
    @ts = localtime;
}
my $date = strftime "%B %d %Y", @ts;

sub outseealso {
    my (@sa) = @_;
    my $comma = 0;
    my @o;
    push @o, ".SH SEE ALSO\n";
    for my $s (sort @sa) {
        push @o, sprintf "%s.BR $s", $comma ? ",\n": "";
        $comma = 1;
    }
    push @o, "\n";
    return @o;
}

sub single {
    my @head;
    my @seealso;
    my ($f)=@_;
    my $title;
    my $section;
    my $source;
    my $start = 0;
    my $d;
    my $line = 0;
    open(F, "<:crlf", "$f") ||
        return 1;
    while(<F>) {
        $line++;
        $d = $_;
        if(!$start) {
            if(/^---/) {
                # header starts here
                $start = 1;
                push @head, $d;
            }
            next;
        }
        if(/^Title: *(.*)/i) {
            $title=$1;
        }
        elsif(/^Section: *(.*)/i) {
            $section=$1;
        }
        elsif(/^Source: *(.*)/i) {
            $source=$1;
        }
        elsif(/^See-also: +(.*)/i) {
            $salist = 0;
            push @seealso, $1;
        }
        elsif(/^See-also: */i) {
            if($seealso[0]) {
                print STDERR "$f:$line:1:ERROR: bad See-Also, needs list\n";
                return 2;
            }
            $salist = 1;
        }
        elsif(/^ +- (.*)/i) {
            # the only list we support is the see-also
            if($salist) {
                push @seealso, $1;
            }
        }
        # REUSE-IgnoreStart
        elsif(/^C: (.*)/i) {
            $copyright=$1;
        }
        elsif(/^SPDX-License-Identifier: (.*)/i) {
            $spdx=$1;
        }
        # REUSE-IgnoreEnd
        elsif(/^---/) {
            # end of the header section
            if(!$title) {
                print STDERR "ERROR: no 'Title:' in $f\n";
                return 1;
            }
            if(!$section) {
                print STDERR "ERROR: no 'Section:' in $f\n";
                return 2;
            }
            if(!$seealso[0]) {
                print STDERR "$f:$line:1:ERROR: no 'See-also:' present\n";
                return 2;
            }
            if(!$copyright) {
                print STDERR "$f:$line:1:ERROR: no 'C:' field present\n";
                return 2;
            }
            if(!$spdx) {
                print STDERR "$f:$line:1:ERROR: no 'SPDX-License-Identifier:' field present\n";
                return 2;
            }
            last;
        }
        else {
            chomp;
            print STDERR "WARN: unrecognized line in $f, ignoring:\n:'$_';"
        }
    }

    if(!$start) {
        print STDERR "$f:$line:1:ERROR: no header present\n";
        return 2;
    }

    my @desc;

    push @desc, sprintf <<HEAD
---
c: Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
SPDX-License-Identifier: curl
Title: $title
Section: $section
Source: $source
HEAD
        ;
    push @desc, "See-also:\n";
    for my $s (sort @seealso) {
        push @desc, "  - $s\n" if($s);
    }
    push @desc, "---\n";

    my $blankline = 0;
    while(<F>) {
        $d = $_;
        $line++;
        if($d =~ /^[ \t]*\n/) {
            $blankline++;
        }
        else {
            $blankline = 0;
        }
        # *italics* for curl symbol links get the asterisks removed
        $d =~ s/\*((lib|)curl[^ ]*\(3\))\*/$1/gi;

        if(length($d) > 90) {
            print STDERR "$f:$line:1:WARN: excessive line length\n";
        }

        push @desc, $d if($blankline < 2);
    }
    close(F);

    if($inplace) {
        open(O, ">$f") || return 1;
        print O @desc;
        close(O);
    }
    else {
        print @desc;
    }
    return 0;
}

if($inplace) {
    for my $a (@ARGV) {
        # this ignores errors
        single($a);
    }
}
else {
    exit single($ARGV[0]);
}
