#! /usr/bin/env perl
# Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License").  You may not use
# this file except in compliance with the License.  You can obtain a copy
# in the file LICENSE in the source distribution or at
# https://www.openssl.org/source/license.html

use strict;
use warnings;

use File::Spec::Functions;
use File::Basename;
use File::Copy;
use File::Path;
use FindBin;
use lib "$FindBin::Bin/perl";
use OpenSSL::Glob;
use Getopt::Long;
use Pod::Usage;

use lib '.';
use configdata;

# We know we are in the 'util' directory and that our perl modules are
# in util/perl
use lib catdir(dirname($0), "perl");
use OpenSSL::Util::Pod;

my %options = ();
GetOptions(\%options,
           'sourcedir=s@',      # Source directories
           'section=i@',        # Subdirectories to look through,
                                # with associated section numbers
           'destdir=s',         # Destination directory
           #'in=s@',             # Explicit files to process (ignores sourcedir)
           'type=s',            # The result type, 'man' or 'html'
           'suffix:s',          # Suffix to add to the extension.
                                # Only used with type=man
           'remove',            # To remove files rather than writing them
           'dry-run|n',         # Only output file names on STDOUT
           'debug|D+',
          );

unless ($options{section}) {
    $options{section} = [ 1, 3, 5, 7 ];
}
unless ($options{sourcedir}) {
    $options{sourcedir} = [ catdir($config{sourcedir}, "doc"),
                            catdir($config{builddir}, "doc") ];
}
pod2usage(1) unless ( defined $options{section}
                      && defined $options{sourcedir}
                      && defined $options{destdir}
                      && defined $options{type}
                      && ($options{type} eq 'man'
                          || $options{type} eq 'html') );
pod2usage(1) if ( $options{type} eq 'html'
                  && defined $options{suffix} );

if ($options{debug}) {
    print STDERR "DEBUG: options:\n";
    foreach (sort @{$options{sourcedir}}) {
        print STDERR "DEBUG:   --sourcedir   = $_\n";
    }
    print STDERR "DEBUG:   --destdir   = $options{destdir}\n"
        if defined $options{destdir};
    print STDERR "DEBUG:   --type      = $options{type}\n"
        if defined $options{type};
    print STDERR "DEBUG:   --suffix    = $options{suffix}\n"
        if defined $options{suffix};
    foreach (sort @{$options{section}}) {
        print STDERR "DEBUG:   --section   = $_\n";
    }
    print STDERR "DEBUG:   --remove    = $options{remove}\n"
        if defined $options{remove};
    print STDERR "DEBUG:   --debug     = $options{debug}\n"
        if defined $options{debug};
    print STDERR "DEBUG:   --dry-run   = $options{\"dry-run\"}\n"
        if defined $options{"dry-run"};
}

my $symlink_exists = eval { symlink("",""); 1 };

foreach my $section (sort @{$options{section}}) {
    my $subdir = "man$section";
    foreach my $sourcedir (@{$options{sourcedir}}) {
        my $podsourcedir = catfile($sourcedir, $subdir);
        my $podglob = catfile($podsourcedir, "*.pod");

        foreach my $podfile (glob $podglob) {
            my $podname = basename($podfile, ".pod");
            my $podpath = catfile($podfile);
            my %podinfo = extract_pod_info($podpath,
                                           { debug => $options{debug},
                                             section => $section });
            my @podfiles = grep { $_ ne $podname } @{$podinfo{names}};

            my $updir = updir();
            my $name = uc $podname;
            my $suffix =
                { man  => ".$podinfo{section}".($options{suffix} // ""),
                  html => ".html" } -> {$options{type}};
            my $generate =
                { man  => <<"_____",
pod2man --name=$name --section=$podinfo{section}  --center=OpenSSL --release=$config{version}  "$podpath"
_____
                  html => <<"_____",
pod2html "--podroot=$sourcedir" --htmldir=$updir --podpath=man1:man3:man5:man7 "--infile=$podpath" "--title=$podname" --quiet
_____
                } -> {$options{type}};
            my $output_dir = catdir($options{destdir}, "man$podinfo{section}");
            my $output_file = $podname . $suffix;
            my $output_path = catfile($output_dir, $output_file);

            if (! $options{remove}) {
                my @output;
                print STDERR "DEBUG: Processing, using \"$generate\"\n"
                    if $options{debug};
                unless ($options{"dry-run"}) {
                    @output = `$generate`;
                    map { s|href="http://man\.he\.net/(man\d/[^"]+)(?:\.html)?"|href="../$1.html"|g; } @output
                        if $options{type} eq "html";
                    if ($options{type} eq "man") {
                        # Because some *roff parsers are more strict than
                        # others, multiple lines in the NAME section must
                        # be merged into one.
                        my $in_name = 0;
                        my $name_line = "";
                        my @newoutput = ();
                        foreach (@output) {
                            if ($in_name) {
                                if (/^\.SH "/) {
                                    $in_name = 0;
                                    push @newoutput, $name_line."\n";
                                } else {
                                    chomp (my $x = $_);
                                    $name_line .= " " if $name_line;
                                    $name_line .= $x;
                                    next;
                                }
                            }
                            if (/^\.SH +"NAME" *$/) {
                                $in_name = 1;
                            }
                            push @newoutput, $_;
                        }
                        @output = @newoutput;
                    }
                }
                print STDERR "DEBUG: Done processing\n" if $options{debug};

                if (! -d $output_dir) {
                    print STDERR "DEBUG: Creating directory $output_dir\n"
                        if $options{debug};
                    unless ($options{"dry-run"}) {
                        mkpath $output_dir
                            or die "Trying to create directory $output_dir: $!\n";
                    }
                }
                print STDERR "DEBUG: Writing $output_path\n" if $options{debug};
                unless ($options{"dry-run"}) {
                    open my $output_fh, '>', $output_path
                        or die "Trying to write to $output_path: $!\n";
                    foreach (@output) {
                        print $output_fh $_;
                    }
                    close $output_fh;
                }
                print STDERR "DEBUG: Done writing $output_path\n" if $options{debug};
            } else {
                print STDERR "DEBUG: Removing $output_path\n" if $options{debug};
                unless ($options{"dry-run"}) {
                    while (unlink $output_path) {}
                }
            }
            print "$output_path\n";

            foreach (@podfiles) {
                my $link_file = $_ . $suffix;
                my $link_path = catfile($output_dir, $link_file);
                if (! $options{remove}) {
                    if ($symlink_exists) {
                        print STDERR "DEBUG: Linking $link_path -> $output_file\n"
                            if $options{debug};
                        unless ($options{"dry-run"}) {
                            symlink $output_file, $link_path;
                        }
                    } else {
                        print STDERR "DEBUG: Copying $output_path to link_path\n"
                            if $options{debug};
                        unless ($options{"dry-run"}) {
                            copy $output_path, $link_path;
                        }
                    }
                } else {
                    print STDERR "DEBUG: Removing $link_path\n" if $options{debug};
                    unless ($options{"dry-run"}) {
                        while (unlink $link_path) {}
                    }
                }
                print "$link_path -> $output_path\n";
            }
        }
    }
}

__END__

=pod

=head1 NAME

process_docs.pl - A script to process OpenSSL docs

=head1 SYNOPSIS

B<process_docs.pl>
[B<--sourcedir>=I<dir>]
B<--destdir>=I<dir>
B<--type>=B<man>|B<html>
[B<--suffix>=I<suffix>]
[B<--remove>]
[B<--dry-run>|B<-n>]
[B<--debug>|B<-D>]

=head1 DESCRIPTION

This script looks for .pod files in the subdirectories 'apps', 'crypto'
and 'ssl' under the given source directory.

The OpenSSL configuration data file F<configdata.pm> I<must> reside in
the current directory, I<or> perl must have the directory it resides in
in its inclusion array.  For the latter variant, a call like this would
work:

 perl -I../foo util/process_docs.pl {options ...}

=head1 OPTIONS

=over 4

=item B<--sourcedir>=I<dir>

Top directory where the source files are found.

=item B<--destdir>=I<dir>

Top directory where the resulting files should end up

=item B<--type>=B<man>|B<html>

Type of output to produce.  Currently supported are man pages and HTML files.

=item B<--suffix>=I<suffix>

A suffix added to the extension.  Only valid with B<--type>=B<man>

=item B<--remove>

Instead of writing the files, remove them.

=item B<--dry-run>|B<-n>

Do not perform any file writing, directory creation or file removal.

=item B<--debug>|B<-D>

Print extra debugging output.

=back

=head1 COPYRIGHT

Copyright 2013-2018 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the Apache License 2.0 (the "License").  You may not use
this file except in compliance with the License.  You can obtain a copy
in the file LICENSE in the source distribution or at
https://www.openssl.org/source/license.html

=cut
