#!/usr/bin/perl
use strict;
use warnings;

=head1 NAME

bem-builder

=head1 SYNOPSIS

    b 8699
    bem-builder make
    bem-builder clean_cache

=head1 DESCRIPTION

Скрипт сборки BEM для Директа и смежных проектов. Функции: запуск скриптов сборки;
проверка результатов; кэширование.

Параметры командной строки:

    --conffile      Имя файла конфигурации (обязательный параметр)
    --rootdir       Корневой каталог проекта (обязательный параметр)
    --logdir        Каталог для файлов с логами (по умолчанию логи пишутся в stderr)
    --cache         Какой кэш использовать: global, user, none или путь
                    к существующему каталогу (по умолчанию global)

=cut

use File::Slurp;
use Getopt::Long;
use JSON;

use Yandex::HashUtils;

use BEM::Builder;

my $opt_conffile;
my $opt_rootdir;
my $opt_logdir;
my $opt_cache = 'global';

my %cmdline_opts = (
    conffile => undef,
    rootdir  => undef,
    logdir   => undef,
    timeout  => undef,
    cache    => 'global',
);

Getopt::Long::GetOptions(
    'conf|conffile=s' => \$cmdline_opts{conffile},
    'root|rootdir=s'  => \$cmdline_opts{rootdir},
    'logdir=s'        => \$cmdline_opts{logdir},
    'cache=s'         => \$cmdline_opts{cache},
    'timeout=i'       => \$cmdline_opts{timeout},
    'help|usage'      => \&usage,
) or die "Invalid options, please refer to --help for usage information.\n";

my ($cmd) = @ARGV;
if ( ! defined $cmd || $cmd eq '' ) {
    die "Missing command, please refer to --help for usage information.\n";
}

my $config = validate_configuration(\%cmdline_opts);

my $result = BEM::Builder::run_command( $cmd, $config );
exit $result;

sub usage {
    system "podselect -section NAME -section SYNOPSIS -section DESCRIPTION $0 | pod2text-utf8 | less";
    exit 0;
}

sub validate_configuration {
    my ($opts) = @_;

    foreach my $required_arg ( qw( conffile rootdir cache ) ) {
        die "Missing required argument: $required_arg\n" unless $opts->{$required_arg};
    }

    my $conffile_contents = read_file( $opts->{conffile} );
    my $config = decode_json($conffile_contents);

    # DIRECT_BEM_MAKE_CACHE приоритетнее, чем параметр в командной строке
    $opts->{cache} = $ENV{DIRECT_BEM_MAKE_CACHE} || $opts->{cache};

    hash_merge( $config, hash_cut( $opts, qw( conffile rootdir logdir cache ) ) );

    # для валидации параметра cache нужна более сложная логика, но она будет нужна всегда,
    # так что можно вызвать её здесь - эта функция возвращает какую-то структуру (её мы сразу выкинем)
    # или порождает исключение, если что-то не так (это нам и нужно)
    BEM::Builder::Tools::get_cache_info($config);

    return $config;
}
