# 🧪 Guia de Teste da Biblioteca

## 🚀 Teste Automatizado (Mais Rápido!)

### Usando os Scripts Prontos:

**Windows (PowerShell):**
```powershell
cd c:\projetos\masfelix\react-native-bluetooth-datecs-printer

# Opção 1: Script completo com logs
.\test-library.ps1

# Opção 2: Script simplificado (mais rápido)
.\test-simple.ps1
```

**Linux/Mac (Bash):**
```bash
cd /path/to/react-native-bluetooth-datecs-printer
chmod +x test-library.sh
./test-library.sh
```

Os scripts automaticamente:
- ✅ Criam um novo projeto Expo
- ✅ Instalam todas as dependências
- ✅ Copiam configuração de exemplo (app.json)
- ✅ Instalam a biblioteca localmente
- ✅ Copiam App.tsx de exemplo completo
- ✅ Executam o prebuild

Depois é só executar:
```bash
cd ../test-printer-app  # ou ../test-printer-simple
npx expo run:android
```

---

## Opção 1: Testar Localmente (Recomendado para Desenvolvimento)

### Método A: Usando npm link

#### 1. Na pasta da biblioteca:
```bash
cd c:\projetos\masfelix\react-native-bluetooth-datecs-printer
npm link
```

#### 2. Crie um novo projeto Expo para teste:
```bash
cd c:\projetos\test-apps
npx create-expo-app@latest printer-test-app
cd printer-test-app
```

#### 3. Instale as dependências necessárias:
```bash
npm install
npx expo install expo-build-properties
npm link react-native-bluetooth-datecs-printer
```

#### 4. Configure o app.json:
```json
{
  "expo": {
    "name": "printer-test-app",
    "slug": "printer-test-app",
    "version": "1.0.0",
    "plugins": [
      [
        "expo-build-properties",
        {
          "android": {
            "compileSdkVersion": 36,
            "targetSdkVersion": 36,
            "minSdkVersion": 26,
            "buildToolsVersion": "35.0.0"
          }
        }
      ]
    ],
    "android": {
      "permissions": [
        "BLUETOOTH",
        "BLUETOOTH_ADMIN",
        "BLUETOOTH_CONNECT",
        "BLUETOOTH_SCAN",
        "ACCESS_FINE_LOCATION",
        "ACCESS_COARSE_LOCATION"
      ],
      "package": "com.test.printerapp"
    }
  }
}
```

#### 5. Execute o prebuild e rode o app:
```bash
npx expo prebuild --clean
npx expo run:android
```

#### Para desvincular depois:
```bash
# No projeto de teste
npm unlink react-native-bluetooth-datecs-printer

# Na pasta da biblioteca
npm unlink
```

---

### Método B: Usando arquivo local (mais simples)

#### 1. No projeto de teste:
```bash
cd c:\projetos\test-apps
npx create-expo-app@latest printer-test-app
cd printer-test-app
npm install
npx expo install expo-build-properties
```

#### 2. Instale a biblioteca localmente:
```bash
npm install file:../masfelix/react-native-bluetooth-datecs-printer
```

ou com caminho absoluto:
```bash
npm install file:c:/projetos/masfelix/react-native-bluetooth-datecs-printer
```

#### 3. Configure app.json (mesmo do Método A)

#### 4. Execute:
```bash
npx expo prebuild --clean
npx expo run:android
```

#### Para atualizar após mudanças na biblioteca:
```bash
npm uninstall react-native-bluetooth-datecs-printer
npm install file:../masfelix/react-native-bluetooth-datecs-printer
npx expo prebuild --clean
```

---

## Opção 2: Publicar em npm Registry (Para Produção)

### Publicação Oficial:

#### 1. Atualize a versão no package.json:
```json
{
  "version": "2.0.0"
}
```

#### 2. Faça login no npm:
```bash
npm login
```

#### 3. Publique:
```bash
cd c:\projetos\masfelix\react-native-bluetooth-datecs-printer
npm publish
```

#### 4. Use em qualquer projeto:
```bash
npm install react-native-bluetooth-datecs-printer@2.0.0
```

---

## Opção 3: Publicar em GitHub Packages (Privado)

### 1. Configure .npmrc na raiz da biblioteca:
```
@masfelix:registry=https://npm.pkg.github.com
```

### 2. Atualize package.json:
```json
{
  "name": "@masfelix/react-native-bluetooth-datecs-printer",
  "publishConfig": {
    "registry": "https://npm.pkg.github.com"
  }
}
```

### 3. Faça login no GitHub Packages:
```bash
npm login --registry=https://npm.pkg.github.com
```

### 4. Publique:
```bash
npm publish
```

### 5. Use em outros projetos:
```bash
npm install @masfelix/react-native-bluetooth-datecs-printer
```

---

## Opção 4: Usar Git diretamente (Sem publicar)

### No projeto de teste, instale diretamente do Git:

```bash
# Via HTTPS
npm install https://github.com/masfelix/react-native-bluetooth-datecs-printer.git

# Via SSH
npm install git+ssh://git@github.com:masfelix/react-native-bluetooth-datecs-printer.git

# Branch específico
npm install https://github.com/masfelix/react-native-bluetooth-datecs-printer.git#main

# Tag específica
npm install https://github.com/masfelix/react-native-bluetooth-datecs-printer.git#v2.0.0
```

### No package.json do projeto de teste:
```json
{
  "dependencies": {
    "react-native-bluetooth-datecs-printer": "github:masfelix/react-native-bluetooth-datecs-printer#main"
  }
}
```

---

## 📱 Aplicação de Teste Completa

### Crie App.tsx no projeto de teste:

```typescript
import React, { useEffect, useState } from 'react';
import { 
  View, 
  Button, 
  Text, 
  PermissionsAndroid, 
  Platform,
  Alert,
  FlatList,
  StyleSheet,
  SafeAreaView,
  ScrollView
} from 'react-native';
import { RNBluetoothDatecsPrinter } from 'react-native-bluetooth-datecs-printer';

export default function App() {
  const [devices, setDevices] = useState([]);
  const [connectedDevice, setConnectedDevice] = useState(null);
  const [status, setStatus] = useState('Desconectado');

  useEffect(() => {
    requestPermissions();
  }, []);

  const requestPermissions = async () => {
    if (Platform.OS === 'android') {
      if (Platform.Version >= 31) {
        const granted = await PermissionsAndroid.requestMultiple([
          PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT,
          PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN,
        ]);
        
        const allGranted = 
          granted['android.permission.BLUETOOTH_CONNECT'] === 'granted' &&
          granted['android.permission.BLUETOOTH_SCAN'] === 'granted';
        
        if (!allGranted) {
          Alert.alert('Permissões necessárias', 'Conceda as permissões de Bluetooth');
        }
      }
    }
  };

  const scanDevices = async () => {
    try {
      setStatus('Buscando dispositivos...');
      const pairedDevices = await RNBluetoothDatecsPrinter.getDeviceList();
      setDevices(pairedDevices);
      setStatus(`${pairedDevices.length} dispositivos encontrados`);
      
      if (pairedDevices.length === 0) {
        Alert.alert('Nenhum dispositivo', 'Pareie a impressora nas configurações do Bluetooth');
      }
    } catch (error) {
      setStatus('Erro ao buscar dispositivos');
      Alert.alert('Erro', error.message);
    }
  };

  const connect = async (device) => {
    try {
      setStatus('Conectando...');
      await RNBluetoothDatecsPrinter.connect(device.address);
      setConnectedDevice(device);
      setStatus(`Conectado: ${device.name}`);
      Alert.alert('Conectado!', `Conectado a ${device.name}`);
    } catch (error) {
      setStatus('Erro ao conectar');
      Alert.alert('Erro', error.message);
    }
  };

  const disconnect = async () => {
    try {
      await RNBluetoothDatecsPrinter.disconnect();
      setConnectedDevice(null);
      setStatus('Desconectado');
      Alert.alert('Desconectado', 'Impressora desconectada');
    } catch (error) {
      Alert.alert('Erro', error.message);
    }
  };

  const printTest = async () => {
    if (!connectedDevice) {
      Alert.alert('Erro', 'Conecte-se a uma impressora primeiro');
      return;
    }

    try {
      setStatus('Imprimindo...');
      await RNBluetoothDatecsPrinter.printText('\n');
      await RNBluetoothDatecsPrinter.printText('=== TESTE DE IMPRESSÃO ===\n');
      await RNBluetoothDatecsPrinter.printText('\n');
      await RNBluetoothDatecsPrinter.printText('Data: ' + new Date().toLocaleString('pt-BR') + '\n');
      await RNBluetoothDatecsPrinter.printText('\n');
      await RNBluetoothDatecsPrinter.printText('Biblioteca Atualizada!\n');
      await RNBluetoothDatecsPrinter.printText('Expo SDK 54\n');
      await RNBluetoothDatecsPrinter.printText('Android SDK 36\n');
      await RNBluetoothDatecsPrinter.printText('\n');
      await RNBluetoothDatecsPrinter.printText('==========================\n');
      await RNBluetoothDatecsPrinter.printText('\n\n\n');
      
      setStatus('Impressão concluída!');
      Alert.alert('Sucesso!', 'Impressão concluída');
    } catch (error) {
      setStatus('Erro ao imprimir');
      Alert.alert('Erro', error.message);
    }
  };

  return (
    <SafeAreaView style={styles.container}>
      <ScrollView>
        <View style={styles.content}>
          <Text style={styles.title}>🖨️ Teste Datecs Printer</Text>
          
          <View style={styles.statusBox}>
            <Text style={styles.statusLabel}>Status:</Text>
            <Text style={styles.statusText}>{status}</Text>
          </View>

          <View style={styles.buttonContainer}>
            <Button title="🔍 Buscar Impressoras" onPress={scanDevices} />
          </View>

          {connectedDevice && (
            <View style={styles.connectedBox}>
              <Text style={styles.connectedTitle}>✅ Conectado</Text>
              <Text style={styles.connectedDevice}>{connectedDevice.name}</Text>
              <Text style={styles.connectedAddress}>{connectedDevice.address}</Text>
              
              <View style={styles.buttonRow}>
                <View style={styles.buttonHalf}>
                  <Button title="📄 Imprimir Teste" onPress={printTest} color="#28a745" />
                </View>
                <View style={styles.buttonHalf}>
                  <Button title="🔌 Desconectar" onPress={disconnect} color="#dc3545" />
                </View>
              </View>
            </View>
          )}

          <Text style={styles.sectionTitle}>Dispositivos Pareados:</Text>
          
          {devices.length === 0 ? (
            <Text style={styles.emptyText}>
              Nenhum dispositivo. Toque em "Buscar Impressoras"
            </Text>
          ) : (
            devices.map((device) => (
              <View key={device.address} style={styles.deviceItem}>
                <View style={styles.deviceInfo}>
                  <Text style={styles.deviceName}>
                    {device.name || 'Dispositivo Desconhecido'}
                  </Text>
                  <Text style={styles.deviceAddress}>{device.address}</Text>
                </View>
                <Button
                  title={connectedDevice?.address === device.address ? '✓' : 'Conectar'}
                  onPress={() => connect(device)}
                  disabled={connectedDevice?.address === device.address}
                  color={connectedDevice?.address === device.address ? '#28a745' : '#007bff'}
                />
              </View>
            ))
          )}

          <View style={styles.infoBox}>
            <Text style={styles.infoTitle}>ℹ️ Informações</Text>
            <Text style={styles.infoText}>• Expo SDK 54</Text>
            <Text style={styles.infoText}>• Android SDK 36</Text>
            <Text style={styles.infoText}>• React Native 0.76+</Text>
            <Text style={styles.infoText}>• AndroidX</Text>
          </View>
        </View>
      </ScrollView>
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#f5f5f5',
  },
  content: {
    padding: 20,
  },
  title: {
    fontSize: 28,
    fontWeight: 'bold',
    textAlign: 'center',
    marginBottom: 20,
    color: '#333',
  },
  statusBox: {
    backgroundColor: '#fff',
    padding: 15,
    borderRadius: 8,
    marginBottom: 20,
    borderWidth: 1,
    borderColor: '#ddd',
  },
  statusLabel: {
    fontSize: 12,
    color: '#666',
    marginBottom: 5,
  },
  statusText: {
    fontSize: 16,
    fontWeight: 'bold',
    color: '#333',
  },
  buttonContainer: {
    marginBottom: 20,
  },
  connectedBox: {
    backgroundColor: '#d4edda',
    padding: 15,
    borderRadius: 8,
    marginBottom: 20,
    borderWidth: 1,
    borderColor: '#c3e6cb',
  },
  connectedTitle: {
    fontSize: 16,
    fontWeight: 'bold',
    color: '#155724',
    marginBottom: 5,
  },
  connectedDevice: {
    fontSize: 18,
    fontWeight: 'bold',
    color: '#155724',
  },
  connectedAddress: {
    fontSize: 12,
    color: '#155724',
    marginBottom: 15,
  },
  buttonRow: {
    flexDirection: 'row',
    gap: 10,
  },
  buttonHalf: {
    flex: 1,
  },
  sectionTitle: {
    fontSize: 18,
    fontWeight: 'bold',
    marginBottom: 10,
    color: '#333',
  },
  emptyText: {
    textAlign: 'center',
    color: '#999',
    padding: 20,
    backgroundColor: '#fff',
    borderRadius: 8,
  },
  deviceItem: {
    flexDirection: 'row',
    justifyContent: 'space-between',
    alignItems: 'center',
    backgroundColor: '#fff',
    padding: 15,
    marginBottom: 10,
    borderRadius: 8,
    borderWidth: 1,
    borderColor: '#ddd',
  },
  deviceInfo: {
    flex: 1,
  },
  deviceName: {
    fontSize: 16,
    fontWeight: 'bold',
    color: '#333',
  },
  deviceAddress: {
    fontSize: 12,
    color: '#666',
    marginTop: 4,
  },
  infoBox: {
    backgroundColor: '#e7f3ff',
    padding: 15,
    borderRadius: 8,
    marginTop: 20,
    borderWidth: 1,
    borderColor: '#b3d9ff',
  },
  infoTitle: {
    fontSize: 16,
    fontWeight: 'bold',
    color: '#004085',
    marginBottom: 10,
  },
  infoText: {
    fontSize: 14,
    color: '#004085',
    marginBottom: 5,
  },
});
```

---

## 🧪 Checklist de Testes

### Testes Básicos:
- [ ] App compila sem erros
- [ ] Permissões são solicitadas corretamente
- [ ] Lista de dispositivos é exibida
- [ ] Conecta à impressora Datecs
- [ ] Imprime texto corretamente
- [ ] Desconecta corretamente

### Testes Android:
- [ ] Android 14+ (API 34-36)
- [ ] Android 12-13 (API 31-33)
- [ ] Android 8-11 (API 26-30)
- [ ] Permissões runtime funcionam
- [ ] Build de release funciona

### Testes de Build:
- [ ] `npx expo run:android` funciona
- [ ] `npx expo prebuild` funciona
- [ ] Build de produção funciona
- [ ] EAS Build funciona (se aplicável)

---

## 🐛 Troubleshooting

### Erro: "Cannot find module"
```bash
# Limpe o cache
npm cache clean --force
rm -rf node_modules package-lock.json
npm install
npx expo prebuild --clean
```

### Erro: "Namespace not specified"
Certifique-se de que está usando a versão atualizada da biblioteca

### Build falha
```bash
cd android
./gradlew clean
cd ..
npx expo prebuild --clean
```

### Permissões negadas
Verifique se o app.json tem todas as permissões e se está solicitando em runtime

---

## 📝 Comandos Úteis

```bash
# Ver logs do Android
npx expo run:android --no-install --device

# Limpar tudo
npx expo prebuild --clean
cd android && ./gradlew clean && cd ..

# Build de produção
eas build --platform android --profile production

# Desinstalar app do dispositivo
adb uninstall com.test.printerapp
```

---

## ✅ Teste Rápido (1 minuto)

```bash
# Criar projeto de teste
npx create-expo-app@latest test-printer --template blank
cd test-printer

# Instalar biblioteca local
npm install file:../react-native-bluetooth-datecs-printer
npx expo install expo-build-properties

# Copiar configuração de exemplo
cp ../react-native-bluetooth-datecs-printer/app.json.example ./app.json

# Copiar exemplo
cp ../react-native-bluetooth-datecs-printer/examples/ExpoExample.tsx ./App.tsx

# Build e executar
npx expo prebuild --clean
npx expo run:android
```
