#!/usr/bin/perl

use 5.022;
use warnings;

use FindBin qw($Bin);
use lib "$Bin/../lib";

use Pod::Usage qw(pod2usage);
use Cwd qw(getcwd);
use Hacker;

my %args = process_command_line(qw/driver=s i|input=s o|output=s e|exec=s h|help v|version/, usage());

if ($args{version}) {
	say "Hacker $Hacker::VERSION";
	exit;
}

my @signal;

my $hacker = new Hacker(driver => $args{driver});

my $stdout = ($ARGV[-1] // '') eq '-';
my $stdin = ($ARGV[-2] // '') eq '-';

my $file = $args{input} // $ARGV[-1] // '';

my $pwd = getcwd;

if (my $code = $args{exec} || $stdin || !(-f $file)) {
	if ($stdin || !$code || $code eq '1') {
		$code = join '', <>;
	}
	
	$code = q[use Hacker;] . $code;
		
	# Execute
	@signal = eval $code; die $@ if $@;
} else {
	@signal = load($file);
}

chdir $pwd;

if (my $file = $args{output}) {
	$hacker->render($file => @signal);
} elsif ($stdout) {
	$hacker->render('<STDOUT>' => @signal);
} else {
	$hacker->play(@signal);
}

sub usage {
	my $file = @_ ? "$_[0]" : (caller)[1];
	open my $handle, '>', \my $output;
	pod2usage -exitval => 'noexit', -input => $file, -output => $handle;
	$output =~ s/^.*\n|\n$//;
	$output =~ s/\n$//g;
	return $output;
}


1;

=encoding utf8

=head1 NAME

hacker - Console DAW for music engeeners

=head1 SYNOPSIS

Usage: hacker [OPTIONS] [project-file.hacker] [-] [-]

       hacker -e "chip sine" -o filename.raw
       hacker -i project.hacker -o filename.raw
       echo "chip sine" | hacker | aplay -q -f s16_le -r 44100 -
       	
Options:

       --input, -i       Input project file
       --output, -o      Output RAW PCM Mono 16 bit 44100 Hz file
       --exec, -e        Execure project code from console
       --help, -h        Show help
       --version, -v     Show version

Hacker developed by Ivan Trunaev, Russia, 2026

Contacts <ivan@trunaev.ru>

=cut
