// 🌀 シンプルな迷路ジェネレーター - outboxキーワード活用デモ
// より単純なアルゴリズムで確実に動く迷路を生成

print("=== Simple Maze Generator with outbox ===")

// Cellの定義（迷路の1マス）
box Cell {
    init { x, y, isWall }
    
    Cell(x_pos, y_pos, wall_flag) {
        me.x = x_pos
        me.y = y_pos
        me.isWall = wall_flag
    }
    
    makePassage() {
        me.isWall = false
    }
    
    makeWall() {
        me.isWall = true
    }
}

// 迷路Box定義
box Maze {
    init { width, height, cells }
    
    Maze(w, h) {
        me.width = w
        me.height = h
        me.cells = new MapBox()
        
        // 初期化：全部壁にする
        local y, x, key, cell
        y = 0
        loop(y < h) {
            x = 0
            loop(x < w) {
                key = x + "," + y
                cell = new Cell(x, y, true)  // 初期状態は壁
                me.cells.set(key, cell)
                x = x + 1
            }
            y = y + 1
        }
    }
    
    // 座標からCellを取得
    getCell(x, y) {
        local key
        key = x + "," + y
        return me.cells.get(key)
    }
    
    // シンプルな迷路生成
    generateSimple() {
        print("Generating simple maze...")
        
        // 奇数座標を通路にする（単純なグリッドパターン）
        local y, x, cell
        y = 1
        loop(y < me.height - 1) {
            x = 1
            loop(x < me.width - 1) {
                // 両方とも奇数なら通路
                if isOddSimple(x) && isOddSimple(y) {
                    cell = me.getCell(x, y)
                    cell.makePassage()
                }
                x = x + 1
            }
            y = y + 1
        }
        
        // 偶数行の奇数列に通路を追加（縦の通路）
        y = 2
        loop(y < me.height - 1) {
            x = 1
            loop(x < me.width - 1) {
                if isEvenSimple(y) && isOddSimple(x) {
                    // 50%の確率で通路にする（疑似ランダム）
                    if shouldMakePassage(x, y) {
                        cell = me.getCell(x, y)
                        cell.makePassage()
                    }
                }
                x = x + 2
            }
            y = y + 2
        }
        
        // 奇数行の偶数列に通路を追加（横の通路）
        y = 1
        loop(y < me.height - 1) {
            x = 2
            loop(x < me.width - 1) {
                if isOddSimple(y) && isEvenSimple(x) {
                    // 50%の確率で通路にする（疑似ランダム）
                    if shouldMakePassage(x + 1, y + 1) {
                        cell = me.getCell(x, y)
                        cell.makePassage()
                    }
                }
                x = x + 2
            }
            y = y + 2
        }
    }
    
    // 迷路を表示
    display() {
        print("\nGenerated Maze:")
        local y, x, line, cell
        y = 0
        loop(y < me.height) {
            line = ""
            x = 0
            loop(x < me.width) {
                cell = me.getCell(x, y)
                if cell.isWall {
                    line = line + "■"
                } else {
                    line = line + "  "
                }
                x = x + 1
            }
            print(line)
            y = y + 1
        }
    }
}

// MazeFactory定義
box MazeFactory {
    init { dummy }
}

// static関数でoutboxを使用
static function MazeFactory.createSimple(width, height) {
    print("MazeFactory.createSimple called with size: " + width + "x" + height)
    
    // outbox変数で迷路オブジェクトを作成
    outbox maze
    maze = new Maze(width, height)
    
    // 迷路を生成
    maze.generateSimple()
    
    return maze  // 所有権を呼び出し側に移転
}

// ヘルパー関数（簡易版）
function isOddSimple(n) {
    // 2で割った余りが1かチェック（簡易実装）
    local div2
    div2 = n * 0  // 0で初期化
    loop(div2 * 2 + 1 <= n) {
        div2 = div2 + 1
    }
    return (n == div2 * 2 + 1)
}

function isEvenSimple(n) {
    // 2で割った余りが0かチェック（簡易実装）
    local div2
    div2 = n * 0  // 0で初期化
    loop(div2 * 2 < n) {
        div2 = div2 + 1
    }
    return (n == div2 * 2)
}

// 疑似ランダムで通路にするか決定
function shouldMakePassage(x, y) {
    // 座標ベースの疑似ランダム
    local seed
    seed = (x * 7 + y * 13) - ((x * 7 + y * 13) >= 100) * 100
    return seed < 50
}

// メイン実行
print("\n--- Small Maze (11x7) ---")
maze1 = MazeFactory.createSimple(11, 7)
maze1.display()

print("\n--- Medium Maze (21x11) ---")
maze2 = MazeFactory.createSimple(21, 11)
maze2.display()

print("\n=== Simple Maze Generator completed! ===")
print("Note: Outbox successfully transfers maze ownership!")