==============================================================================
GUIA DE INTEGRAÇÃO E USO - M-SiTef Flutter (Via CliSiTef)
==============================================================================

Este guia detalha como configurar e utilizar a biblioteca `msitef_flutter` refatorada para utilizar diretamente a biblioteca nativa CliSiTef (Software Express), eliminando a necessidade do aplicativo M-SiTef externo.

------------------------------------------------------------------------------
PASSO 1: INSTALAÇÃO DOS ARQUIVOS NATIVOS (OBRIGATÓRIO)
------------------------------------------------------------------------------
Como a biblioteca CliSiTef é proprietária, você precisa adicionar manualmente os arquivos fornecidos pela Software Express ao projeto.

1. Baixe o SDK Android do CliSiTef.
2. Copie o arquivo `clisitef-android.jar` para a pasta:
   [Raiz do Projeto]/android/libs/clisitef-android.jar

3. Copie as pastas de arquitetura (`armeabi-v7a`, `arm64-v8a`, `x86`, etc) contendo os arquivos `.so` (ex: `libclisitef.so`) para:
   [Raiz do Projeto]/android/src/main/jniLibs/

   Estrutura final deve ficar assim:
   android/
     libs/
       clisitef-android.jar
     src/
       main/
         jniLibs/
           armeabi-v7a/
             libclisitef.so
             ...
           arm64-v8a/
             libclisitef.so
             ...

------------------------------------------------------------------------------
PASSO 2: IMPORTAÇÃO NO FLUTTER
------------------------------------------------------------------------------
No seu arquivo `pubspec.yaml`, adicione a dependência (assumindo uso local ou git):

dependencies:
  msitef_flutter:
    path: ./caminho/para/libmSitefFlutter

Em seguida, importe no seu código Dart:

import 'package:msitef_flutter/msitef_flutter.dart';

------------------------------------------------------------------------------
PASSO 3: CONFIGURAÇÃO INICIAL
------------------------------------------------------------------------------
Antes de realizar vendas, você deve configurar o terminal. Isso geralmente é feito na inicialização do app.

await MsitefFlutter.configure(
  enderecoSitef: "192.168.0.100",  // IP do servidor SiTef
  codigoLoja: "00000000",          // Código da loja
  numeroTerminal: "SE000001",      // Número do terminal
  cnpjLoja: "00000000000000",      // CNPJ da loja
  cnpjAutomacao: "00000000000000", // CNPJ da automação (Desenvolvedor)
);

------------------------------------------------------------------------------
PASSO 4: EXEMPLO DE VENDA CRÉDITO
------------------------------------------------------------------------------
A nova arquitetura utiliza `Streams` para comunicar eventos (mensagens de pinpad, solicitações de senha, menu, etc).

Aqui está um exemplo completo de como iniciar uma venda Crédito à Vista e tratar o fluxo:

void realizarVendaCredito() {
  // 1. Inicie a escuta dos eventos antes de chamar a venda
  MsitefFlutter.venda(
    valor: 10.50,                // R$ 10,50
    cupomFiscal: "123456",       // No. do Cupom
    dataFiscal: "20231025",      // YYYYMMDD
    horaFiscal: "143000",        // HHMMSS
    operador: "FUNC01",
    // Restrições específicas para Crédito (Função 0 geralmente é genérica, 
    // mas pode-se passar restrições para forçar menus ou comportamentos)
    // Para Crédito à Vista direto, verifique a documentação de 'Restrições' do SiTef.
    // Exemplo genérico abaixo; muitas vezes o SiTef pergunta a função se modalidade for 0.
    restricoes: "TransacoesHabilitadas=26;", // Exemplo: 26 costuma ser Crédito
  ).listen((event) {
    
    // Tratamento dos Eventos do Fluxo
    
    if (event is MsitefEventMessage) {
      print("MENSAGEM: ${event.message}");
      // Atualize a UI com a mensagem (ex: "Insira o cartão")
    } 
    else if (event is MsitefEventPinpadMessage) {
      print("DISPLAY PINPAD: ${event.message}");
      // Mensagem para mostrar apenas se você tiver um 'display virtual' do pinpad na tela
    }
    else if (event is MsitefEventMenu) {
      // O SiTef mandou um menu para o usuário escolher
      print("MENU: ${event.title}");
      for (var i = 0; i < event.options.length; i++) {
        print("$i: ${event.options[i]}");
      }
      // ... Mostre o menu na UI ...
      // Ao selecionar, responda:
      // MsitefFlutter.continueTransaction("1"); // Selecionou opção 1
    }
    else if (event is MsitefEventInput) {
      // O SiTef precisa de um dado (ex: CPF, Senha, etc)
      print("DIGITE: ${event.message}");
      // ... Mostre campo de input na UI ...
      // Ao digitar:
      // MsitefFlutter.continueTransaction("123456"); 
    }
    else if (event is MsitefEventConfirmation) {
      // Confirmação (Sim/Não)
      print("CONFIRMA? ${event.message}");
      // MsitefFlutter.continueTransaction("1"); // 1=Sim, 0=Não
    }
    else if (event is MsitefEventSuccess) {
      print("VENDA APROVADA!");
      print("NSU: ${event.response.fields['NSU_HOST']}");
      print("Via Cliente: \n${event.response.fields['VIA_CLIENTE']}");

      // IMPORTANTE: Confirmar a transação após sucesso
      MsitefFlutter.finishTransaction(
        confirm: true, 
        cupomFiscal: "123456",
        dataFiscal: "20231025",
        horaFiscal: "143000"
      );
    }
    else if (event is MsitefEventFailure) {
      print("ERRO NA VENDA: ${event.message} (Cód: ${event.code})");
    }
  });
}

------------------------------------------------------------------------------
DICAS IMPORTANTES
------------------------------------------------------------------------------
- O fluxo é assíncrono e orientado a eventos. Sua interface (UI) deve ser reativa.
- Sempre chame `finishTransaction` ao final de uma transação com sucesso (Sucesso no fluxo TEF pendente) para efetivar a venda.
- Veja os logs do Android (Logcat) para depurar problemas de conexão com a biblioteca nativa `libclisitef.so`.

==============================================================================
