#!/usr/bin/perl
# d2ds: del .d (SCEPTRE) al .ds2 (un .ds sin errores).
#
#   d2ds ARCHIVO.d [-o SALIDA.ds2] [--biblioteca DIR]
#
# Por defecto escribe ARCHIVO.ds2 al lado. Incluye libraryori.siru y
# rk.siru de Simulparser/biblioteca (o de DIR), con la ruta relativa al
# .ds2. Lo que no tiene equivalente en Simul queda comentado con "# d2ds:"
# adelante; las notas salen por la salida de errores. Despues pasa el
# resultado por arreglar() (dsarregla), asi que sale sin errores.
# Traducciones: ver lib/Simusol/D2ds.pm y DOCUMENTACION.md.
#
# Copyright (C) Diego Saravia <dsa@unsa.edu.ar>
# GPL version 3 o posterior.

use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin/../lib";
use Getopt::Long qw(GetOptions);
use Simusol::D2ds;
use Simusol::Simulparser;

my ($salida, $biblioteca, $ayuda) = (undef, "$FindBin::Bin/../../slex/d2datdinc/biblioteca");
GetOptions('o|salida=s' => \$salida, 'biblioteca=s' => \$biblioteca, 'h|help|ayuda' => \$ayuda)
    or uso(2);
uso(0) if $ayuda;
uso(2) if @ARGV != 1;
my $d = $ARGV[0];
$salida //= $d =~ s/\.[^.\/]*\z//r . '.ds2';

my ($texto, $notas) = eval { Simusol::D2ds::traducir($d, $salida, $biblioteca) };
if (not defined $texto) { print STDERR "d2ds: $@"; exit 1; }
open(my $fh, '>:encoding(UTF-8)', $salida) or die "d2ds: $salida: $!\n";
print $fh $texto;
close $fh;
print STDERR "d2ds: $d:$_\n" for @$notas;

# el resultado, sin errores
my ($arreglado, $cambios, $errores) = Simusol::Simulparser::arreglar($salida);
open($fh, '>:encoding(UTF-8)', $salida) or die "d2ds: $salida: $!\n";
print $fh $arreglado;
close $fh;
print STDERR "d2ds: $salida:$_ (arreglado)\n" for @$cambios;
print STDERR "d2ds: $salida:$_ (ERROR)\n" for @$errores;
print STDERR "d2ds: escrito $salida\n";
exit(@$errores ? 1 : 0);

sub uso {
    my ($estado) = @_;
    my $fh = $estado ? \*STDERR : \*STDOUT;
    print $fh "uso: d2ds ARCHIVO.d [-o SALIDA.ds2] [--biblioteca DIR]\n";
    exit $estado;
}
