#!/usr/bin/env perl
use strict;
use warnings;
use FindBin qw($Bin);
use lib $Bin;
use Dinstar::CallForward;
use Synway::CallForward;

# ------------------------------------------------------------------
# Constantes de configuración (ver charla anterior sobre "define"
# en Perl: use constant es lo idiomático)
# ------------------------------------------------------------------
use constant {
    DINSTAR_USER => 'admin',
    SYNWAY_USER  => 'ApiUserAdmin',
};

# ------------------------------------------------------------------
# Ejemplo de uso — Dinstar
# ------------------------------------------------------------------
sub forward_dinstar {
    my ($ip, $password, $port, $slot, $number) = @_;

    my $gw = Dinstar::CallForward->new(
        ip       => $ip,
        user     => DINSTAR_USER,
        password => $password,
    );

    print "Dinstar $ip puerto $port/slot $slot -> aplicando forward a $number...\n";

    # Setear (el módulo relee y confirma internamente; verify => 1 es el default)
    my $result = eval {
        $gw->set_unconditional_forward(
            port   => $port,
            slot   => $slot,
            number => $number,
            enable => 1,
        );
    };

    if ($@) {
        warn "Dinstar $ip puerto $port/slot $slot -> FALLO al confirmar: $@";
        return undef;
    }

    print "Dinstar $ip puerto $port/slot $slot -> forward a $number: CONFIRMADO por el gateway.\n";
    return $result;
}

# ------------------------------------------------------------------
# Ejemplo de uso — Synway
# ------------------------------------------------------------------
sub forward_synway {
    my ($ip, $password, $channel, $number) = @_;

    my $gw = Synway::CallForward->new(
        ip       => $ip,
        user     => SYNWAY_USER,
        password => $password,
    );

    $gw->login;   # si el modelo lo requiere

    print "Synway $ip canal $channel -> aplicando forward a $number...\n";

    # Setear (el módulo relee y confirma internamente; verify => 1 es el default)
    my $result = eval {
        $gw->set_unconditional_forward(
            channel => $channel,
            number  => $number,
            enable  => 1,
        );
    };

    if ($@) {
        warn "Synway $ip canal $channel -> FALLO al confirmar: $@";
        return undef;
    }

    print "Synway $ip canal $channel -> forward a $number: CONFIRMADO por el gateway.\n";
    return $result;
}

# ------------------------------------------------------------------
# Ejemplo: recorrer gateway_ports desde MySQL y aplicar forwarding
# (usando la tabla que ya manejás en el sistema de billing/gateways)
# ------------------------------------------------------------------
#
# use DBI;
# my $dbh = DBI->connect("dbi:mysql:database=tu_db;host=127.0.0.1", "user", "pass",
#     { RaiseError => 1, AutoCommit => 1 });
#
# my $sth = $dbh->prepare(qq{
#     select gateway_ports.ip, gateway_ports.port, gateway_ports.slot,
#            gateway_ports.api_user, gateway_ports.api_password,
#            gateways.tipo_gw
#     from gateway_ports
#     join gateways on gateways.id = gateway_ports.gw
#     where gateways.active = 1
# });
# $sth->execute;
#
# while (my $row = $sth->fetchrow_hashref) {
#     eval {
#         if ($row->{tipo_gw} eq 'dinstar') {
#             forward_dinstar($row->{ip}, $row->{api_password},
#                              $row->{port}, $row->{slot}, '54934XXXXXXX');
#         }
#         elsif ($row->{tipo_gw} eq 'synway') {
#             forward_synway($row->{ip}, $row->{api_password},
#                             $row->{port}, '54934XXXXXXX');
#         }
#         1;
#     } or do {
#         warn "Error en gateway $row->{ip}: $@";
#     };
# }

# ------------------------------------------------------------------
# Prueba manual (ajustar IP/credenciales/puerto reales)
# ------------------------------------------------------------------
if (!caller) {
#    forward_dinstar('10.0.66.104', 'pepito20', 1, 1, '1144255139');
#    forward_synway('10.0.66.104', 'pepito20', 1, 1, '1144255139');
    print "Script listo. Descomentar las llamadas de prueba con datos reales.\n";
}

1;