package com.zinep.script;
import com.zinep.*;
import com.zinep.sucursales.Local;
import com.zinep.sucursales.Virtual;
import com.zinep.trans.Transaccion;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* @author tomas
*/
public class Reader {
private List<String> lineas;
public Reader(List<String> lineas) {
this.lineas = lineas;
}
public void procesar() {
String etiqueta = "([a-zA-Z0-9]+)";
String numero = "([0-9]+)";
String w = "\\s+"; // whitespace
String del = "\\s*"; // delimiter
Pattern rBanco = Pattern.compile(del + "Banco" + w + etiqueta + del);
Pattern rMostrador = Pattern.compile(del + "Mostrador" + w + "(Preferencial|Regular)" + w + etiqueta + w + numero + del);
Pattern rCliente = Pattern.compile(del + "Cliente" + w + "(Preferencial|Regular)" + w + etiqueta + w + numero + del);
Pattern rSucursal = Pattern.compile(del + "Sucursal" + w + etiqueta + w + "UYU" + w + numero + w + "USD" + w + numero + del);
Pattern rCuenta = Pattern.compile(del + "Cuenta" + w + etiqueta + w + "(UYU|USD)" + w + numero + del);
Pattern rInstante = Pattern.compile(del + "Instante" + w + numero + w + etiqueta + w + numero + w + etiqueta + del);
Banco banco = null;
Sucursal sucursal = null;
Cliente cliente = null;
Matcher matcher = null;
List<Sucursal> sucursales = null;
List<Cuenta> cuentas = null;
Simulacion sim = null;
Simulacion.LlegadaCliente llegada = null;
Transaccion trn = null;
TrnParser trnParser = new TrnParser();
for (int i = 0; i < lineas.size(); i++) {
String linea = lineas.get(i);
if ((matcher = rBanco.matcher(linea)).find()) {
sucursales = new LinkedList<Sucursal>();
banco = new Banco(matcher.group(1), sucursales);
sim = new Simulacion(banco);
} else if ((matcher = rSucursal.matcher(linea)).find()) {
String nombre = matcher.group(1);
Monto uyu = new Monto(Long.parseLong(matcher.group(2)), Moneda.UYU);
Monto usd = new Monto(Long.parseLong(matcher.group(3)), Moneda.USD);
if (nombre.equals("Local")) {
sucursal = new Local(nombre, uyu, usd);
} else if (nombre.equals("Virtual")) {
sucursal = new Virtual(nombre, uyu, usd);
}
sucursales.add(sucursal);
} else if ((matcher = rCliente.matcher(linea)).find()) {
String tipo = matcher.group(1);
String nombre = matcher.group(2);
int id = Integer.parseInt(matcher.group(3));
cuentas = new LinkedList<Cuenta>();
cliente = new Cliente(nombre, id, tipo.equals("Preferencial"), cuentas);
banco.agregarCliente(id, cliente);
} else if ((matcher = rCuenta.matcher(linea)).find()) {
String tipo = matcher.group(1);
String moneda = matcher.group(2);
Monto monto = new Monto(Long.parseLong(matcher.group(3)), moneda.equals("UYU") ? Moneda.UYU : Moneda.USD);
final Cuenta cuenta = new Cuenta(monto.getMoneda());
cuenta.aumentarMonto(monto);
cuentas.add(cuenta);
} else if ((matcher = rInstante.matcher(linea)).find()) {
//"Instante" + w + numero + w + etiqueta + w + numero + w + etiqueta + del);
int instante = Integer.parseInt(matcher.group(1));
String nombreCliente = matcher.group(2);
int idCliente = Integer.parseInt(matcher.group(3));
String nombreSucursal = matcher.group(4);
cliente = banco.getCliente(nombreCliente);
sucursal = banco.getSucursal(nombreSucursal);
llegada = new Simulacion.LlegadaCliente(
instante,
cliente,
sucursal);
sim.add(llegada);
} else if ((trn = trnParser.parse(banco, sucursal, cliente, linea)) != null) {
llegada.add(trn);
} else {
System.out.println("Línea ignorada:\n" + linea);
}
}
System.out.println("Banco:" + banco);
for (Sucursal sucursal1 : banco.getSucursales()) {
System.out.println("\tSucursal: " + sucursal1);
for (Agente agente : sucursal1.getAgentes()) {
System.out.println("\t\tAgente: " + agente);
}
}
for (Cliente cliente1 : banco.getClientes().values()) {
System.out.println("\tCliente: " + cliente1);
for (Cuenta cuenta : cliente1.getCuentasCliente()) {
System.out.println("\t\tCuenta:" + cuenta);
}
}
sim.correr();
}
}