#!/usr/bin/env python3
"""
Bitcoin Operations Dataset Collector
Gathers documentation for fine-tuning a Bitcoin AI assistant.
"""

import os
import json
import requests
from pathlib import Path
from urllib.parse import urljoin

# Bitcoin operations documentation sources
DOCS_SOURCES = {
    "bitcoin_core": "https://developer.bitcoin.org",
    "lightning_cln": "https://lightning.engineering/docs",
    "lightning_spec": "https://github.com/lightning/bolts",
    "mining": "https://github.com/bitcoin/bitcoin/blob/master/doc/mining.md",
    "bitcoinops": "https://bitcoinops.org",
    "lnbook": "https://lnbook.org",
}

def create_dataset_structure(base_dir):
    """Create directory structure for organized dataset."""
    categories = [
        "lightning_network",
        "bitcoin_core",
        "mining",
        "node_operations",
        "wallet_security",
        "bitcoin_scripting",
    ]
    for cat in categories:
        Path(base_dir / cat).mkdir(parents=True, exist_ok=True)

def download_and_parse(url, output_dir, category):
    """Download documentation and parse into training format."""
    try:
        response = requests.get(url, timeout=30)
        if response.status_code == 200:
            # Basic text extraction
            text = response.text.replace('<br>', '\n').replace('</p>', '\n\n')
            # Save as raw doc
            filename = f"{category}_{hash(url) % 10000}.txt"
            with open(output_dir / filename, 'w', encoding='utf-8') as f:
                f.write(text)
            return True
    except Exception as e:
        print(f"Failed to fetch {url}: {e}")
    return False

def create_finetuning_format(docs_dir, output_path):
    """Convert collected docs into fine-tuning format."""
    training_data = []
    
    for doc_file in docs_dir.glob("*.txt"):
        with open(doc_file, 'r', encoding='utf-8') as f:
            content = f.read()
        
        # Create Q&A pairs from documentation
        paragraphs = content.split('\n\n')
        for i, para in enumerate(paragraphs):
            if len(para.strip()) < 50:  # Skip short paragraphs
                continue
                
            # Create instruction-response pairs
            training_data.append({
                "instruction": f"Explain: {para[:100]}...",
                "input": "",
                "output": para
            })
    
    with open(output_path, 'w') as f:
        json.dump(training_data, f, indent=2)
    
    return len(training_data)

if __name__ == "__main__":
    base_dir = Path(__file__).parent
    create_dataset_structure(base_dir)
    print("Dataset structure created. Starting collection...")
    
    # Collect documentation
    for category, url in DOCS_SOURCES.items():
        output_dir = base_dir / category
        print(f"Collecting {category} from {url}")
        download_and_parse(url, output_dir, category)
    
    # Convert to fine-tuning format
    print("Converting to fine-tuning format...")
    total_examples = create_finetuning_format(
        base_dir, 
        base_dir / "bitcoin_finetuning.json"
    )
    print(f"Created {total_examples} training examples")