// 📊 マンデルブロ集合フラクタル - MathBoxの数学的美しさ
// WebCanvasBox で複素数計算の視覚化

print("📊 === Mandelbrot Fractal Generator ===")

// デバッグシステム
DEBUG = new DebugBox()
DEBUG.startTracking()

// 🔢 複素数Box - 数学的計算をBox化
box ComplexBox {
    init { real, imaginary }
    
    ComplexBox(r, i) {
        me.real = r
        me.imaginary = i
    }
    
    // 複素数の乗算 z * z
    multiply(other) {
        newReal = me.real * other.real - me.imaginary * other.imaginary
        newImag = me.real * other.imaginary + me.imaginary * other.real
        return new ComplexBox(newReal, newImag)
    }
    
    // 複素数の加算 z + c
    add(other) {
        return new ComplexBox(me.real + other.real, me.imaginary + other.imaginary)
    }
    
    // 絶対値の2乗（発散判定用）
    magnitudeSquared() {
        return me.real * me.real + me.imaginary * me.imaginary
    }
}

// 🎨 フラクタル描画Box
box MandelbrotBox {
    init { canvas, width, height, maxIterations, zoom, centerX, centerY }
    
    MandelbrotBox(canvasId, w, h) {
        me.canvas = new WebCanvasBox(canvasId, w, h)
        me.width = w
        me.height = h
        me.maxIterations = 50
        me.zoom = 1.0
        me.centerX = -0.5  // マンデルブロ集合の中心
        me.centerY = 0.0
        
        DEBUG.trackBox(me, "MandelbrotGenerator")
    }
    
    // 点がマンデルブロ集合に属するか判定
    mandelbrotIterations(c) {
        z = new ComplexBox(0.0, 0.0)  // z0 = 0
        
        iteration = 0
        loop (iteration < me.maxIterations) {
            // z = z^2 + c の反復計算
            z = z.multiply(z).add(c)
            
            // 発散判定（|z| > 2）
            if z.magnitudeSquared() > 4.0 {
                return iteration
            }
            
            iteration = iteration + 1
        }
        
        return me.maxIterations  // 収束（マンデルブロ集合内）
    }
    
    // 反復回数を色に変換
    getColor(iterations) {
        if iterations == me.maxIterations {
            return "black"  // マンデルブロ集合内
        }
        
        // カラフルなグラデーション
        ratio = iterations / me.maxIterations
        
        if ratio < 0.25 {
            return "blue"
        } else {
            if ratio < 0.5 {
                return "cyan"
            } else {
                if ratio < 0.75 {
                    return "yellow"
                } else {
                    return "red"
                }
            }
        }
    }
    
    // フラクタル描画
    render() {
        print("🎨 Rendering Mandelbrot fractal...")
        print("Zoom: " + me.zoom + ", Center: (" + me.centerX + ", " + me.centerY + ")")
        
        // 画面の各ピクセルを計算
        y = 0
        loop (y < me.height) {
            x = 0
            loop (x < me.width) {
                // スクリーン座標を複素平面座標に変換
                real = (x - me.width / 2) / (me.width / 4) / me.zoom + me.centerX
                imag = (y - me.height / 2) / (me.height / 4) / me.zoom + me.centerY
                
                c = new ComplexBox(real, imag)
                iterations = me.mandelbrotIterations(c)
                color = me.getColor(iterations)
                
                // ピクセル描画
                me.canvas.setFillStyle(color)
                me.canvas.fillRect(x, y, 1, 1)
                
                x = x + 2  // パフォーマンス向上のため2ピクセル刻み
            }
            y = y + 2
            
            // 進行状況表示
            if y % 20 == 0 {
                progress = (y * 100) / me.height
                print("Progress: " + progress + "%")
            }
        }
        
        // 情報表示
        me.canvas.setFillStyle("white")
        me.canvas.fillText("Mandelbrot Set - Zoom: " + me.zoom, 10, 20)
        me.canvas.fillText("Everything is Box Mathematics!", 10, 40)
    }
    
    // ズームイン
    zoomIn(factor) {
        me.zoom = me.zoom * factor
    }
    
    // 中心移動
    setCenter(x, y) {
        me.centerX = x
        me.centerY = y
    }
}

// 🚀 フラクタル生成開始！
print("Creating Mandelbrot fractal generator...")
mandelbrot = new MandelbrotBox("fractal-canvas", 400, 400)

// 基本フラクタル描画
mandelbrot.render()

print("🌟 Generated beautiful Mandelbrot fractal!")
print("🔢 Complex number calculations with ComplexBox")
print("🎨 Mathematical art through WebCanvasBox")

// ズームイン版も生成
print("📊 Creating zoomed version...")
mandelbrot.setCenter(-0.8, 0.156)  // 興味深い領域
mandelbrot.zoomIn(2.0)
mandelbrot.render()

// 最終レポート
print(DEBUG.memoryReport())
print("✨ Mathematics is beautiful with Everything is Box!")
print("🐱 Complex numbers, iterations, colors - all unified as Boxes!")