// 📊 統計計算アプリ - MathBox新機能を活用！
// Everything is Box哲学による統計ライブラリ

print("📊 === Statistics Calculator ===")
print("MathBox拡張機能を活用した統計計算デモ\n")

// デバッグトラッキング開始
DEBUG = new DebugBox()
DEBUG.startTracking()

// 統計計算を行うBox
box Statistics {
    init {
        data,
        math
    }
    
    // データ追加
    func addData(value) {
        me.data.push(value)
    }
    
    // データ一括追加
    func addMultiple(values) {
        i = 0
        loop(i < values.length()) {
            me.addData(values.get(i))
            i = i + 1
        }
    }
    
    // 平均値計算
    func mean() {
        if (me.data.length() == 0) {
            return new NullBox()
        }
        
        sum = 0
        i = 0
        loop(i < me.data.length()) {
            sum = sum + me.data.get(i)
            i = i + 1
        }
        
        // 除算がないので掛け算で代用
        count = me.data.length()
        mean = sum * me.math.pow(count, -1)  // sum / count
        return mean
    }
    
    // 分散計算
    func variance() {
        if (me.data.length() == 0) {
            return new NullBox()
        }
        
        avg = me.mean()
        sumSquaredDiff = 0
        i = 0
        
        loop(i < me.data.length()) {
            diff = me.data.get(i) - avg
            sumSquaredDiff = sumSquaredDiff + (diff * diff)
            i = i + 1
        }
        
        count = me.data.length()
        variance = sumSquaredDiff * me.math.pow(count, -1)
        return variance
    }
    
    // 標準偏差計算
    func standardDeviation() {
        var = me.variance()
        // NullBoxかどうかチェック（型チェックで判定）
        if (var.type_name() == "NullBox") {
            return new NullBox()
        }
        return me.math.sqrt(var)
    }
    
    // 最大値
    func max() {
        if (me.data.length() == 0) {
            return new NullBox()
        }
        
        maxVal = me.data.get(0)
        i = 1
        loop(i < me.data.length()) {
            maxVal = me.math.max(maxVal, me.data.get(i))
            i = i + 1
        }
        return maxVal
    }
    
    // 最小値
    func min() {
        if (me.data.length() == 0) {
            return new NullBox()
        }
        
        minVal = me.data.get(0)
        i = 1
        loop(i < me.data.length()) {
            minVal = me.math.min(minVal, me.data.get(i))
            i = i + 1
        }
        return minVal
    }
    
    // 範囲（レンジ）
    func range() {
        return me.max() - me.min()
    }
    
    // データ表示
    func showData() {
        print("\n📈 Data points (" + me.data.length() + " items):")
        i = 0
        loop(i < me.data.length()) {
            print("  [" + i + "] = " + me.data.get(i))
            i = i + 1
        }
    }
    
    // 統計サマリー表示
    func summary() {
        print("\n📊 Statistical Summary:")
        print("  Count: " + me.data.length())
        print("  Mean: " + me.mean())
        print("  Std Dev: " + me.standardDeviation())
        print("  Min: " + me.min())
        print("  Max: " + me.max())
        print("  Range: " + me.range())
    }
}

// 統計インスタンスを作成する関数
function createStatistics() {
    stats = new Statistics()
    stats.data = new ArrayBox()
    stats.math = new MathBox()
    return stats
}

// テストデータで実行
print("\n🧪 Test 1: 学生のテスト得点分析")
stats = createStatistics()
DEBUG.trackBox(stats, "Statistics-TestScores")

// テストスコアを追加
scores = new ArrayBox()
scores.push(85)
scores.push(92)
scores.push(78)
scores.push(95)
scores.push(88)
scores.push(73)
scores.push(90)
scores.push(82)

stats.addMultiple(scores)
stats.showData()
stats.summary()

// 新しい機能：三角関数を使った周期データ分析
print("\n\n🌊 Test 2: 周期的データ分析（正弦波）")
wave = createStatistics()
DEBUG.trackBox(wave, "Statistics-WaveData")

// 正弦波データを生成
math = new MathBox()
pi = math.getPi()
i = 0
loop(i < 20) {
    // angle = i * π / 10
    angle = i * pi * 0.1  // 除算の代わり
    value = math.sin(angle) * 10 + 50  // 振幅10、中心50
    wave.addData(math.round(value))
    i = i + 1
}

wave.showData()
wave.summary()

// 対数正規分布風のデータ
print("\n\n📈 Test 3: 成長データ分析（指数関数的）")
growth = createStatistics()
DEBUG.trackBox(growth, "Statistics-GrowthData")

i = 1
loop(i <= 10) {
    // 指数関数的成長をシミュレート
    value = math.exp(i * 0.3) * 10
    growth.addData(math.round(value))
    i = i + 1
}

growth.showData()
growth.summary()

// NullBox活用：欠損データの扱い
print("\n\n🔍 Test 4: 欠損データの扱い")
incomplete = createStatistics()
incomplete.addData(10)
incomplete.addData(20)
// 空のデータセットの統計値
empty = createStatistics()
emptyMean = empty.mean()

print("Empty dataset mean is null: " + emptyMean.is_null())

// メモリ使用状況
print("\n\n💾 Memory Report:")
print(DEBUG.memoryReport())

print("\n✅ Statistics Calculator completed!")