#!/bin/bash

# Script para generar claves de firma para extensiones
# Classic Add-ons Archive v3.0

set -e

echo "=================================================="
echo "  Generador de Claves de Firma"
echo "=================================================="
echo ""

# Colores
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'

KEYS_DIR="private-keys"
CHROME_KEY="$KEYS_DIR/chrome-extension.pem"
FIREFOX_JWT="$KEYS_DIR/firefox-amo-credentials.json"

# Crear directorio de claves si no existe
if [ ! -d "$KEYS_DIR" ]; then
    mkdir -p "$KEYS_DIR"
    echo -e "${GREEN}✓${NC} Directorio de claves creado: $KEYS_DIR/"
fi

# Generar clave privada para Chrome
echo ""
echo "Generando clave privada para Chrome..."
if [ -f "$CHROME_KEY" ]; then
    echo -e "${YELLOW}⚠${NC} La clave de Chrome ya existe: $CHROME_KEY"
    read -p "¿Deseas regenerarla? (s/N): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Ss]$ ]]; then
        echo "Manteniendo clave existente"
    else
        openssl genrsa -out "$CHROME_KEY" 2048
        echo -e "${GREEN}✓${NC} Clave de Chrome regenerada"
    fi
else
    openssl genrsa -out "$CHROME_KEY" 2048
    echo -e "${GREEN}✓${NC} Clave de Chrome generada: $CHROME_KEY"
fi

# Generar ID de extensión de Chrome desde la clave
if [ -f "$CHROME_KEY" ]; then
    echo ""
    echo "Calculando Extension ID de Chrome..."
    
    # Extraer la clave pública en formato DER y calcular ID
    # Alternativa sin xxd: usar od + awk
    openssl rsa -in "$CHROME_KEY" -pubout -outform DER 2>/dev/null | \
    openssl dgst -sha256 -binary | \
    head -c 16 | \
    od -An -tx1 | \
    tr -d ' \n' | \
    tr '0-9a-f' 'a-p' > "$KEYS_DIR/chrome-extension-id.txt"
    
    CHROME_ID=$(cat "$KEYS_DIR/chrome-extension-id.txt")
    echo -e "${GREEN}✓${NC} Extension ID: $CHROME_ID"
    echo "   (Guardado en: $KEYS_DIR/chrome-extension-id.txt)"
fi

# Generar hash de la clave para verificación
if [ -f "$CHROME_KEY" ]; then
    KEY_HASH=$(sha256sum "$CHROME_KEY" | cut -d' ' -f1)
    echo "$KEY_HASH" > "$KEYS_DIR/chrome-key-hash.txt"
    echo -e "${GREEN}✓${NC} Hash de verificación guardado"
fi

# Información sobre credenciales de Firefox
echo ""
echo "=================================================="
echo "  Credenciales de Firefox (AMO)"
echo "=================================================="
echo ""
echo "Para firmar extensiones de Firefox necesitas credenciales de AMO:"
echo ""
echo "1. Ve a: https://addons.mozilla.org/developers/addon/api/key/"
echo "2. Genera un nuevo par de credenciales (JWT issuer y secret)"
echo "3. Guarda las credenciales en: $FIREFOX_JWT"
echo ""

if [ ! -f "$FIREFOX_JWT" ]; then
    echo "Plantilla de credenciales de Firefox:"
    cat > "$FIREFOX_JWT" << 'EOF'
{
  "web-ext": {
    "sign": {
      "apiKey": "user:12345678:123",
      "apiSecret": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
      "channel": "unlisted"
    }
  }
}
EOF
    echo -e "${YELLOW}⚠${NC} Archivo de plantilla creado: $FIREFOX_JWT"
    echo -e "${YELLOW}⚠${NC} EDITA este archivo con tus credenciales reales de AMO"
    echo ""
    echo "Nota: El ID de la extensión se lee automáticamente de manifest.json"
else
    echo -e "${GREEN}✓${NC} Archivo de credenciales encontrado: $FIREFOX_JWT"
fi

# Crear archivo .gitignore para el directorio de claves
cat > "$KEYS_DIR/.gitignore" << 'EOF'
# Ignorar todas las claves privadas
*.pem
*.key
*.p12
*.pfx
*-credentials.json
*-hash.txt

# Permitir README
!README.md
EOF

echo -e "${GREEN}✓${NC} Archivo .gitignore creado en $KEYS_DIR/"

# Crear README en el directorio de claves
cat > "$KEYS_DIR/README.md" << 'EOF'
# Claves Privadas de Firma

Este directorio contiene las claves privadas para firmar las extensiones.

## ⚠️ IMPORTANTE: Seguridad

- **NUNCA** subas estas claves a repositorios públicos
- **NUNCA** compartas estas claves con nadie
- Haz backup de estas claves en un lugar seguro
- Si pierdes las claves, perderás el ID de la extensión de Chrome

## Archivos

### Chrome
- `chrome-extension.pem` - Clave privada RSA 2048-bit
- `chrome-extension-id.txt` - ID de la extensión derivado de la clave
- `chrome-key-hash.txt` - Hash SHA256 para verificación

### Firefox
- `firefox-amo-credentials.json` - Credenciales de API de AMO (addons.mozilla.org)

## Uso

Las claves se usan automáticamente por los scripts de build:
```bash
./build.sh --sign        # Firma ambas versiones
./build.sh --sign-chrome # Solo Chrome
./build.sh --sign-firefox # Solo Firefox
```

## Regenerar claves

```bash
cd scripts
./generate-keys.sh
```

**Nota:** Regenerar la clave de Chrome cambiará el ID de la extensión.

## Obtener credenciales de Firefox

1. Inicia sesión en https://addons.mozilla.org
2. Ve a: https://addons.mozilla.org/developers/addon/api/key/
3. Genera credenciales JWT
4. Copia API Key (issuer) y API Secret
5. Actualiza `firefox-amo-credentials.json`
EOF

echo -e "${GREEN}✓${NC} README creado en $KEYS_DIR/"

# Proteger permisos de archivos sensibles
chmod 600 "$CHROME_KEY" 2>/dev/null || true
chmod 600 "$FIREFOX_JWT" 2>/dev/null || true
chmod 700 "$KEYS_DIR"

echo ""
echo "=================================================="
echo "  ✨ Claves generadas exitosamente"
echo "=================================================="
echo ""
echo "Archivos creados:"
echo "  - $CHROME_KEY (clave privada Chrome)"
echo "  - $KEYS_DIR/chrome-extension-id.txt (ID de extensión)"
echo "  - $KEYS_DIR/chrome-key-hash.txt (hash de verificación)"
echo "  - $FIREFOX_JWT (plantilla de credenciales)"
echo ""
echo "Próximos pasos:"
echo ""
echo "  1. BACKUP: Guarda $CHROME_KEY en un lugar seguro"
echo ""
echo "  2. Configura Firefox AMO:"
echo "     - Edita: $FIREFOX_JWT"
echo "     - Agrega tus credenciales de AMO"
echo ""
echo "  3. Firma extensiones:"
echo "     ./build.sh --sign"
echo ""
echo "=================================================="
echo ""
