use strict;
use 5.005;

use ExtUtils::MakeMaker;
use Getopt::Long;

use vars qw(%APACHE);

my %opts;
GetOptions( \%opts, 'no-prompts' );

require 'install/apache_tests_helper.pl';
require 'install/assisted_install_helper.pl';

eval { require HTML::Mason };

unless ($@)
{
    if ( $HTML::Mason::VERSION < 1.09 )
    {
	print <<"EOF";

It looks like you have an older version of Mason already installed on
your machine (version $HTML::Mason::VERSION).  This version is not backwards
compatible with versions of Mason before version 1.10.
Please read the UPGRADE document before continuing with this
installation.

EOF

	unless ( $opts{'no-prompts'} )
	{
	    my $yn = prompt('Continue with installation?', 'N');

	    exit unless $yn =~ /y(?:es)?/i;
	}
    }
}

# These are required modules.
my %prereq = ( 'File::Spec' => {version => 0.8,
				where => "CPAN/modules/by-module/File/File-Spec-x.x.tar.gz"},
	       'Params::Validate' => {version => 0.59,
				      where => "CPAN/modules/by-authors/id/D/DR/DROLSKY/Params-Validate-x.x.tar.gz"},
	       'Exception::Class' => {version => 1.14,
				      where => "CPAN/modules/by-module/Exception/Exception-Class-x.x.tar.gz"},
	       'Cache::Cache' => {version => 1.00,
				  where => "CPAN/modules/by-authors/id/D/DC/DCLINTON/Cache-Cache-x.x.tar.gz"},
               'Class::Container' => {version => 0.07,
				      where => "CPAN/modules/by-authors/id/K/KW/KWILLIAMS/Class-Container-x.x.tar.gz"},
               'Scalar::Util' => {version => 1.01,
                                  where => "CPAN/modules/by-authors/id/G/GB/GBARR/Scalar-List-Utils-x.x.tar.gz"},
               'CGI' => {version => 2.46,
                         where => "CPAN/modules/by-authors/id/G/GB/GBARR/CGI.pm-x.x.tar.gz"},
	     );

foreach (keys %prereq) {
    chk_version($_ => $prereq{$_}{version}) or
	warn  "\n"
	    . "*** Mason requires version $prereq{$_}{version} or later of $_\n"
	    . "    from $prereq{$_}{where}\n\n";
    $prereq{$_} = $prereq{$_}{version};
}

eval { require mod_perl };
my $has_only_mp2 = $@ && eval { require Apache2 };

unless ( ( $@ || $^O =~ /mac|darwin/ ) || $has_only_mp2 )
{
    chk_version('Apache::Request' => '0.32') or
	warn  "\n"
	    . "*** If you plan to use Mason with mod_perl,\n"
	    . "    Mason requires version 0.32, or later, of Apache::Request\n"
	    . "    from CPAN/modules/by-module/Apache/Apache-Request-x.x.tar.gz\n\n";

    $prereq{'Apache::Request'} = 0.32;
}

eval { require Apache::Filter };

unless ( $@ || $Apache::Filter::VERSION >= 1.021 )
{
    warn  "\n"
        . "*** If you plan to use Mason with Apache::Filter \n"
        . "    you will need to install Apache::Filter 1.021 or newer.\n";

    $prereq{'Apache::Filter'} = 1.021;
}

setup_mod_perl_tests() if is_maintainer() && ! $opts{'no-prompts'};
assisted_install_config() unless $opts{'no-prompts'};

# Get these into the MY namespace for the MY::test method
%MY::APACHE = %APACHE;

# Be very careful about removing these files - otherwise, if
# apache_dir isn't set, we're removing things like /httpd and /mason !
my $more_clean_files = ($APACHE{apache_dir} 
			? join(' ', map "$APACHE{apache_dir}/$_", 
			       qw(httpd.conf error_log httpd httpd.pid
                                  mason_handler_CGI.pl mason_handler_mod_perl.pl 
                                  CGIHandler.cgi mason)
			      )
			: '');
  

WriteMakefile(
    'NAME'    => 'HTML::Mason',
    'VERSION_FROM' => 'lib/HTML/Mason.pm',
    'PREREQ_PM' => \%prereq,

    # %APACHE is created when setup_mod_perl_tests() is called.  The
    # code that does this creation is in apache_tests_helper.pl.
    clean => {
	'FILES' => "apache_install.txt lib/HTML/Mason/Config.pm mason_tests $APACHE{comp_root} $APACHE{data_dir} $more_clean_files",
    }
);

sub chk_version
{
    my ($pkg, $wanted, $msg) = @_;

    local $| = 1;
    print "Checking for $pkg...";

    eval { eval "require $pkg" };

    my $vstr;
    my $vnum;
    {
	no strict 'refs';
	$vstr = ${"${pkg}::VERSION"} ? "found v" . ${"${pkg}::VERSION"}	: "not found";
	$vnum = ${"${pkg}::VERSION"} || 0;
    }

    print $vnum >= $wanted ? "ok\n" : " " . $vstr . "\n";

    $vnum >= $wanted;
}

sub is_maintainer
{
    return $ENV{MASON_MAINTAINER} if exists $ENV{MASON_MAINTAINER};

    return -d 'CVS' ? 1 : 0;
}

package MY;

sub install
{
    my $self = shift;

    my $install = $self->SUPER::install(@_);

    $install =~ s/install :: all pure_install doc_install/install :: all pure_install doc_install delete_old_docs configure_apache/;

    $install .= "\nconfigure_apache :\n\t\$(PERL) install/configure_apache.pl\n";

    $install .= "\ndelete_old_docs :\n\t\$(PERL) install/delete_old_pods.pl\n";

    return $install;
}

sub test
{
    my $self = shift;

    my $test = $self->SUPER::test(@_);

    # %MY::APACHE is set in makeconfig.pl.
    # If we are not going to test with Apache there is no harm in
    # setting this anyway.

    # The PORT env var is used by Apache::test.  Don't delete it!
    my $port = $MY::APACHE{port} || 8228;
    $MY::APACHE{apache_dir} ||= '';

    my $is_maintainer = main::is_maintainer();

    # This works for older MakeMakers
    $test =~ s/(runtests \@ARGV;)/\$\$ENV{PORT}=$port; \$\$ENV{APACHE_DIR}=q^$MY::APACHE{apache_dir}^; \$\$ENV{MASON_MAINTAINER}=$is_maintainer; $1/;

    my $bs = $^O =~ /Win32/i ? '' : '\\';

    # This works for newer MakeMakers (5.48_01 +)
    $test =~ s/("-MExtUtils::Command::MM" "-e" ")(test_harness\(\$\(TEST_VERBOSE\).*?\)" \$\(TEST_FILES\))/$1 $bs\$\$ENV{PORT}=$port; $bs\$\$ENV{APACHE_DIR}=q^$MY::APACHE{apache_dir}^; $bs\$\$ENV{MASON_MAINTAINER}=$is_maintainer; $2/;

    return $test;
}

# prevents the Makefile from trying to process the Build.PL file into
# Build
sub processPL { '' }

sub libscan
{
    my $self = shift;
    my $file = shift;

    return $file =~ /\.pl$/ ? 0 : $self->SUPER::libscan($file);
}
