Subversion Repositories Integrator Subversion

Rev

Blame | Last modification | View Log | Download | RSS feed

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;
    }
   
}