package PugsConfig;
use strict;
use warnings;
use Cwd;
use Config();
use File::Spec;
use FindBin; 
our %Config = %Config::Config;

sub get_config {
    my $self = shift;
    if ( -e ( my $build_config = File::Spec->catfile( $FindBin::RealBin, 'current.build.yml' ) ) ) {
        open my $fh, $build_config or die "Cannot read from $build_config";
        my $config = {};
        while (<$fh>) {
            next if /^#/;
            $config->{$1} = /^(\S+):\s(.*)$/ && ( @+ > 1 ? $2 : '');
        }
        return $config;
    }

    my %args = @_;
    my $config = {
        perl_revision   => '6',
        perl_version    => '0',
        perl_subversion => '0',
        perl_compiler   => 'pugs',
        osname          => $^O,
        sourcedir       => Cwd::abs_path(),
    };
    if ( @_ ) {
        $config->{$_} = $args{$_} for keys %args;
    }

    $config->{perl5_path} = $Config{perlpath};
    for ( qw/path_sep privlib archlib siteprefix sitebin sitescript sitearch sitelib 
            installbin installscript installman1dir installman3dir installsitebin
            installsiteman1dir installsiteman3dir
            archname bin exe_ext installarchlib installprivlib
            installsitearch installsitelib pager prefix scriptdir  
            / ) {
        $config->{$_} ||= $_ =~ /(lib|arch)$/
                ? add_path( $_, $Config{$_} )
                : $Config{$_};
    }
    $config->{installsiteman1dir} ||= $Config{installman1dir};
    $config->{installsiteman3dir} ||= $Config{installman3dir};
    for (qw/installsitescript installscript/) {
        $config->{sitescript} ||= $Config{$_}
    }
    $config->{installsitebin} ||= $Config{installsbin};

    $config->{pugspath}  =
      File::Spec->catfile($config->{installbin}, "pugs$Config{exe_ext}");

    ($config->{file_sep}) =
      ($config->{sitelib} =~ /([\/\\])/)
        or die "Can't determine file_sep";

    return $config;
}

sub add_path {
    my ($name, $path) = @_;
    $path =~ s/([\/\\])[^\/\\]*(perl)[^\/\\]*([\/\\]?)/$1${2}6$3/i
      or $path =~ s/([\/\\])(lib)(?=[\/\\]|$)/$1$2${1}perl6/i
#      or $path =~ m/\bman\d\b/
      or die <<".";
Can't generate the correct Perl6 equivalent for:

    $path

field name: $name
osname: $Config{osname}

Please notify the maintainer of this code. (Brian Ingerson for now)
.
# XXX Not sure about the above heuristic. So die if incorrect.
    $path =~ s/\/\d+\.\d+\.\d+//g;
    $path;
}

sub write_config_module {
    my $config = get_config();
    my $template = do { local $/; <DATA> };

    my $all_fields = join ",\n    ", map {
        "config_$_";
    } sort keys %$config;
    $template =~ s/#all_fields#/$all_fields/;

    my $all_definitions = join ",\n    ", map {
        my $name = $_;
        my $value = $config->{$name};
        $value =~ s{\\}{\\\\}g;
        qq{("$name", "$value")};
    } sort keys %$config;
    $template =~ s/#all_definitions#/$all_definitions/;

    print $template;
}

sub __test__ {
    $Config{privlib} = 'C:\usr\lib';
    $Config{archlib} = 'C:\usr\lib';
    $Config{sitearch} = 'C:\usr\site\lib';
    $Config{sitelib} = 'C:\usr\site\lib';
    require Data::Dumper;
    print Data::Dumper::Dumper(get_config());
}
#__test__;

1;

__DATA__
{-# OPTIONS -fglasgow-exts #-}

{-
    *** NOTE ***
    DO NOT EDIT THIS FILE.
    This module is generated by util/PugsConfig.pm.
-}

{-|
    Pugs System Configuration.

>   Alive without breath;
>   as cold as death;
>   never thirsting, ever drinking;
>   clad in mail, never clinking.
-}


module Pugs.Config (
    config,
    getConfig
) where

import qualified Data.Map as Map
import qualified Pugs.Version

config :: Map.Map String String
config = Map.fromList
    [#all_definitions#
    ,("pugs_versnum", Pugs.Version.versnum)
    ,("pugs_version", Pugs.Version.version)
    ,("pugs_revision", Pugs.Version.revnum)
    ]

getConfig :: String -> String
getConfig key = Map.findWithDefault "" key config
