#!/usr/bin/perl
use strict;

use MyDef;
my $def_file;
my %config;
my $default_module=$MyDef::var->{module};
foreach my $a (@ARGV) {
    if ($a =~ /^-m(\w+)/) {
        $config{module} = $1;
    }
    elsif ($a =~/^-o(\S+)/) {
        $config{output_dir} = $1;
    }
    elsif ($a =~/^-f(\S+)/) {
        $config{find} = $1;
    }
    elsif ($a =~/^-(dump|debug.*)/) {
        $config{$1} = 1;
    }
    elsif ($a=~/\.def$/) {
        if ($def_file) {
            die "Multiple def source files not supported\n";
        }
        if (-f $a) {
            $def_file=$a;
        }
        else {
            die "$a is not a regular file\n";
        }
    }
    elsif ($a eq "-pipe") {
        $def_file="-pipe";
    }
    elsif ($a eq "-v" or $a eq "--version") {
        my $prog=$0;
        $prog=~s/^.*\///;
        print "$prog: version development - latest\"\n";
        exit(0);
    }
}

if (!$def_file) {
    die "Please supply data definition file.";
}

if ($def_file eq "-pipe") {
    MyDef::pipe_page($config{module});
}
else {
    $config{def_file}=$def_file;

    MyDef::init(%config);
    my $module=$MyDef::var->{module};

    if ($config{"debug-import"}) {
        $MyDef::parseutil::debug={import=>1};
    }
    MyDef::import_data($def_file);
    foreach my $a (@ARGV) {
        if ($a=~/-M(\w+)=(.*)/) {
            $MyDef::def->{macros}->{$1} =$2;
        }
    }

    if ($config{find}) {
        my $def=$MyDef::def;
        my $name=$config{find};
        if ($def->{codes}->{$name}) {
            my $code=$def->{codes}->{$name};
            my $type=$code->{type};
            my $param=join ", ", @{$code->{params}};
            my $source=$code->{source};
            my $indent=1;
            print $type, "code: $name($param)\n";
            foreach my $l (@$source) {
                if ($l=~/^SOURCE_INDENT/) {
                    $indent++;
                }
                elsif ($l=~/^SOURCE_DEDENT/) {
                    $indent--;
                }
                else {
                    print "    "x$indent, $l, "\n";
                }
            }
        }
        elsif ($def->{macros}->{$name}) {
            print "macro: $name: $def->{macros}->{$name}\n";
        }
        else {
            print "name: $name not found.\n";
        }
    }
    elsif ($config{dump}) {
        my $def=$MyDef::def;
        while (my ($k, $v) = each %{$def->{pages}}) {
            print "page: $k\n";
            if ($v->{codes}) {
                while(my ($k2, $v2) = each %{$v->{codes}}){
                    print "    $v2->{type}code: $k2\n";
                }
            }
        }

        while (my ($k, $v) = each %{$def->{codes}}) {
            print "$v->{type}code: $k\n";
        }
    }
    elsif ($config{"debug-import"}) {
    }
    else {
        my $pages=$MyDef::def->{pages};
        my $pagelist=$MyDef::def->{pagelist};
        my ($n_skip, $n_create);

        foreach my $t (@$pagelist) {
            my $p=$pages->{$t};
            if ($p->{subpage}) {
                next;
            }

            my $t_module=$default_module;
            if ($p->{module}) {
                $t_module=$p->{module};
            }
            if ($t_module and ($t_module ne $module)) {
                $n_skip++;
                next;
            }

            $n_create++;
            MyDef::createpage($t);
        }
        if ($n_create==0) {
            print "skiped $n_skip pages (due to module mismatch), use -m to overide default module.\n";
        }
    }
}

