package br.com.sl.core;
import java.io.BufferedReader;
import java.io.InputStream;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import br.com.sl.domain.model.Candle;
import br.com.sl.domain.model.tipos.TipoPeriodoCandle;
import br.com.sl.domain.util.BigDecimalUtils;
public class ProfitDataProviderUtil
{
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.
ofPattern("dd/MM/yyyy");
private static final DateTimeFormatter TIME_FORMAT = DateTimeFormatter.
ofPattern("HH:mm:ss");
public ProfitDataProviderUtil
() {}
public static List<Candle
> lerCandlesDeArquivo
(BufferedReader reader,
String nomeArquivo
) throws Exception {
if (nomeArquivo.
toLowerCase().
endsWith(".csv")) {
return lerCsv
(reader
);
} else if (nomeArquivo.
toLowerCase().
endsWith(".xlsm") || nomeArquivo.
toLowerCase().
endsWith(".xlsx") || nomeArquivo.
toLowerCase().
endsWith(".xls")) {
return null;
// return lerExcel(reader);
} else {
throw new IllegalArgumentException("Formato não suportado: " + nomeArquivo
);
}
}
private static List<Candle
> lerCsv
(BufferedReader reader
) throws Exception {
List<Candle
> candles =
new ArrayList<>();
String linha
;
while ((linha = reader.
readLine()) !=
null) {
// Substitui line.isBlank() por trim().isEmpty()
String trimmed = linha.
trim();
if (trimmed.
isEmpty()) {
continue;
}
// Ajuste aqui se o separador do seu CSV for vírgula
String[] parts = trimmed.
split(";", -
1);
if (parts.
length < 7) {
continue;
}
String ativoDescricao =
"";
String dataStr =
"";
String horaStr =
"";
String aberturaStr =
"";
String maximaStr =
"";
String minimaStr =
"";
String fechamentoStr =
"";
ativoDescricao = parts
[0].
trim();
dataStr = parts
[1].
trim();
if (parts.
length >=
9) {
horaStr = parts
[2].
trim();
aberturaStr = parts
[3].
trim();
maximaStr = parts
[4].
trim();
minimaStr = parts
[5].
trim();
fechamentoStr = parts
[6].
trim();
} else {
horaStr =
"18:00:00";
aberturaStr = parts
[2].
trim();
maximaStr = parts
[3].
trim();
minimaStr = parts
[4].
trim();
fechamentoStr = parts
[5].
trim();
}
// Ignora header, caso exista
if (ativoDescricao.
equalsIgnoreCase("ativo")) {
continue;
}
if (!isNumericString
(aberturaStr
) ||
!isNumericString
(maximaStr
) ||
!isNumericString
(minimaStr
) ||
!isNumericString
(fechamentoStr
)) {
continue;
}
LocalDate data = LocalDate.
parse(dataStr, DATE_FORMAT
);
LocalTime hora = LocalTime.
parse(horaStr, TIME_FORMAT
);
LocalDateTime dataHora = LocalDateTime.
of(data, hora
);
BigDecimal abertura = BigDecimalUtils.
converterStringEmBigDecimal(aberturaStr
);
BigDecimal topo = BigDecimalUtils.
converterStringEmBigDecimal(maximaStr
);
BigDecimal fundo = BigDecimalUtils.
converterStringEmBigDecimal(minimaStr
);
BigDecimal fechamento = BigDecimalUtils.
converterStringEmBigDecimal(fechamentoStr
);
Candle candle =
new Candle
(
null,
ativoDescricao,
dataHora,
abertura,
topo,
fundo,
fechamento,
TipoPeriodoCandle.
M1.
getValor()
);
candles.
add(candle
);
}
return adicionarContadores
(inverterLista
(candles
));
}
private static boolean isNumericString
(String value
) {
if (value ==
null) return false;
String normalized = value.
trim().
replace(".",
"").
replace(",",
".");
if (normalized.
isEmpty()) return false;
try {
new BigDecimal(normalized
);
return true;
} catch (NumberFormatException e
) {
return false;
}
}
// Contador separado para cada ativo
public static List<Candle
> adicionarContadores
(List<Candle
> candles
) {
Map<String,
Integer> contadorPorAtivo =
new java.
util.
HashMap<>();
List<Candle
> comContadores =
new ArrayList<>();
for (Candle candle : candles
) {
// Ajuste aqui o getter conforme estiver na sua classe Candle
// Ex.: getAtivo(), getAtivoDescricao(), getTicker()...
String ativo = candle.
getNomeAtivo();
Integer contadorAtual = contadorPorAtivo.
get(ativo
);
if (contadorAtual ==
null) {
contadorAtual =
0;
}
contadorAtual++
;
contadorPorAtivo.
put(ativo, contadorAtual
);
candle.
setContadorCandle(contadorAtual
);
comContadores.
add(candle
);
}
return comContadores
;
}
public static List<Candle
> inverterLista
(List<Candle
> candles
) {
List<Candle
> invertida =
new ArrayList<>(candles
);
Collections.
reverse(invertida
);
return invertida
;
}
private static List<Candle
> lerExcel
(InputStream is
) throws Exception {
/*
List<Candle> candles = new ArrayList<>();
Workbook wb = WorkbookFactory.create(is);
for (int s = 0; s < wb.getNumberOfSheets(); s++) {
Sheet planilha = wb.getSheetAt(s);
boolean primeira = true;
for (Row row : planilha) {
if (row == null) continue;
if (primeira) {
primeira = false;
continue;
}
int cols = row.getLastCellNum();
String[] col = new String[cols];
for (int i = 0; i < cols; i++) {
Cell cell = row.getCell(i);
col[i] = (cell == null ? "" : formatarCelula(cell));
}
Candle c = converterLinhaEmCandle(col);
if (c != null) candles.add(c);
}
}
return candles;
*/
return null;
}
}