import re
from typing import List

from datapipe.utils.log import Log


class SQLAnsi:

    @staticmethod
    def remover_comentarios(linhas) -> str:
        string = "\n".join([linha.strip() for linha in linhas])
        string = re.sub(re.compile("/\*.*?\*/", re.DOTALL), "", string)
        string = re.sub(re.compile("--.*(?:\n)?"), "", string)
        return string

    @staticmethod
    def carregar_arquivo_sql(arquivo_sql: str, sem_comentarios: bool = True) -> str:
        try:
            with open(arquivo_sql, mode='r', encoding="utf-8-sig") as arq:
                linhas = arq.readlines()
                if sem_comentarios:
                    return SQLAnsi.remover_comentarios(linhas)
                else:
                    return linhas
        except OSError as ex:
            Log.logar(ex)
            raise Exception(
                f"Arquivo '{arquivo_sql}' não encontrado ou acesso negado.")

    @staticmethod
    def carregar_script_multiplo(arquivo_script: str) -> List[str]:
        arquivo_comandos = SQLAnsi.carregar_arquivo_sql(arquivo_script)
        return SQLAnsi.separar_comandos(arquivo_comandos)

    @staticmethod
    def separar_comandos(script_limpo) -> List[str]:
        # TODO: usar sqlparse.split(raw)
        # https://github.com/andialbrecht/sqlparse/blob/master/examples/extract_table_names.py
        return [cmd.strip()
                for cmd in script_limpo.split(";") if cmd.strip()]

import re
from typing import List

from datapipe.utils.log import Log


class SQLAnsi:

    @staticmethod
    def remover_comentarios(linhas) -> str:
        string = "\n".join([linha.strip() for linha in linhas])
        string = re.sub(re.compile("/\*.*?\*/", re.DOTALL), "", string)
        string = re.sub(re.compile("--.*(?:\n)?"), "", string)
        return string

    @staticmethod
    def carregar_arquivo_sql(arquivo_sql: str, sem_comentarios: bool = True) -> str:
        try:
            with open(arquivo_sql, mode='r', encoding="utf-8-sig") as arq:
                linhas = arq.readlines()
                if sem_comentarios:
                    return SQLAnsi.remover_comentarios(linhas)
                else:
                    return linhas
        except OSError as ex:
            Log.logar(ex)
            raise Exception(
                f"Arquivo '{arquivo_sql}' não encontrado ou acesso negado.")

    @staticmethod
    def carregar_script_multiplo(arquivo_script: str) -> List[str]:
        arquivo_comandos = SQLAnsi.carregar_arquivo_sql(arquivo_script)
        return SQLAnsi.separar_comandos(arquivo_comandos)

    @staticmethod
    def separar_comandos(script_limpo) -> List[str]:
        # TODO: usar sqlparse.split(raw)
        # https://github.com/andialbrecht/sqlparse/blob/master/examples/extract_table_names.py
        return [cmd.strip()
                for cmd in script_limpo.split(";") if cmd.strip()]

# TODO: usar sqlparse.split(raw) # https://github.com/andialbrecht/sqlparse/blob/master/examples/extract_table_names.py