#!/bin/bash

# Go ONVIF Library Demo Script
# This script demonstrates the capabilities of the Go ONVIF library

echo "🎥 Go ONVIF Library - Complete Implementation Demo"
echo "=================================================="
echo

echo "📁 Project Structure:"
echo "├── Core Library (client.go, types.go, device.go, media.go, ptz.go, imaging.go)"
echo "├── SOAP Client (soap/soap.go) with WS-Security authentication"
echo "├── Discovery Service (discovery/discovery.go) for network camera detection"
echo "├── Examples (examples/*) showing various use cases"
echo "├── CLI Tools:"
echo "│   ├── 🔧 onvif-cli - Comprehensive interactive tool"
echo "│   └── ⚡ onvif-quick - Simple quick-start tool"
echo "└── Tests with mock ONVIF server"
echo

echo "🚀 Available Commands:"
echo

echo "1. Build & Test:"
echo "   make build        # Build both CLI tools"
echo "   make test         # Run test suite"
echo "   make examples     # Build example programs"
echo "   make build-all    # Build for multiple platforms"
echo

echo "2. CLI Tools:"
echo "   ./bin/onvif-cli   # Interactive comprehensive tool"
echo "   ./bin/onvif-quick # Simple quick-start tool"
echo

echo "3. Library Usage Example:"
cat << 'EOF'
```go
package main

import (
    "context"
    "fmt"
    "time"
    
    "github.com/0x524A/onvif-go"
)

func main() {
    // Create client with credentials
    client, err := onvif.NewClient(
        "http://192.168.1.100/onvif/device_service",
        onvif.WithCredentials("admin", "password"),
        onvif.WithTimeout(30*time.Second),
    )
    if err != nil {
        panic(err)
    }
    
    ctx := context.Background()
    
    // Get device information
    info, err := client.GetDeviceInformation(ctx)
    if err != nil {
        panic(err)
    }
    
    fmt.Printf("Camera: %s %s\n", info.Manufacturer, info.Model)
    
    // Initialize for additional services
    client.Initialize(ctx)
    
    // Get media profiles
    profiles, err := client.GetProfiles(ctx)
    if err != nil {
        panic(err)
    }
    
    // Get stream URI
    streamURI, err := client.GetStreamURI(ctx, profiles[0].Token)
    if err == nil {
        fmt.Printf("Stream: %s\n", streamURI.URI)
    }
    
    // PTZ Control (if supported)
    velocity := &onvif.PTZSpeed{
        PanTilt: &onvif.Vector2D{X: 0.5, Y: 0.0},
    }
    timeout := "PT5S"
    client.ContinuousMove(ctx, profiles[0].Token, velocity, &timeout)
}
```
EOF

echo
echo "🌟 Key Features:"
echo "✅ Complete ONVIF Profile S implementation"
echo "✅ WS-Discovery for automatic camera detection"
echo "✅ WS-Security authentication with digest"
echo "✅ PTZ control (pan, tilt, zoom)"
echo "✅ Media profile management"
echo "✅ Imaging settings control"
echo "✅ Device information and capabilities"
echo "✅ Stream URI generation (RTSP/HTTP)"
echo "✅ Context-based timeout and cancellation"
echo "✅ Comprehensive error handling"
echo "✅ Thread-safe credential management"
echo "✅ Interactive CLI tools"
echo "✅ Docker support"
echo "✅ Cross-platform builds"
echo "✅ Extensive test coverage"
echo

echo "🛠️  Development Features:"
echo "✅ Modern Go 1.21+ with generics support"
echo "✅ Functional options pattern"
echo "✅ Comprehensive type definitions"
echo "✅ Mock server for testing"
echo "✅ Benchmark tests"
echo "✅ CI/CD ready"
echo "✅ Docker containerization"
echo "✅ Multi-platform builds"
echo

echo "📋 Quick Start:"
echo "1. go mod tidy                    # Install dependencies"
echo "2. make build                     # Build CLI tools"
echo "3. ./bin/onvif-quick             # Run quick tool"
echo "4. ./bin/onvif-cli               # Run comprehensive tool"
echo

echo "🔗 For real camera testing:"
echo "- Set up a test camera with known IP/credentials"
echo "- Run discovery to find cameras: ./bin/onvif-quick"
echo "- Use device info to verify connection"
echo "- Test PTZ movements if camera supports it"
echo "- Get stream URLs for media playback"
echo

echo "🎯 This implementation provides a production-ready,"
echo "   comprehensive ONVIF library with full CLI tooling!"

echo
echo "Run 'make help' for all available commands."