VBAF.Business.BusinessAction.ps1

#Requires -Version 5.1

<#
.SYNOPSIS
    Business action definitions for company agents
.DESCRIPTION
    Defines the action space for company decision-making:
    pricing, investment, operational, and strategic actions.
.NOTES
    Part of VBAF Phase 2 - Business Applications
#>


class BusinessAction {
    [string]$Type           # "Pricing", "Investment", "Operational", "Strategic"
    [string]$Name           # Descriptive name
    [hashtable]$Parameters  # Action-specific parameters
    
    # Constructor
    BusinessAction([string]$type, [string]$name, [hashtable]$parameters) {
        $this.Type = $type
        $this.Name = $name
        $this.Parameters = $parameters
    }
    
    # Convert to string for Q-table key
    [string] ToString() {
        return "$($this.Type):$($this.Name)"
    }
    
    # Static factory methods for common actions
    
    # Pricing Actions
    static [BusinessAction] SetPricePremium() {
        return New-Object BusinessAction -ArgumentList "Pricing", "Premium", @{
            PriceMultiplier = 1.3
            ExpectedVolume = 0.7
        }
    }
    
    static [BusinessAction] SetPriceCompetitive() {
        return New-Object BusinessAction -ArgumentList "Pricing", "Competitive", @{
            PriceMultiplier = 1.0
            ExpectedVolume = 1.0
        }
    }
    
    static [BusinessAction] SetPricePenetration() {
        return New-Object BusinessAction -ArgumentList "Pricing", "Penetration", @{
            PriceMultiplier = 0.8
            ExpectedVolume = 1.4
        }
    }
    
    static [BusinessAction] SetPriceDynamic() {
        return New-Object BusinessAction -ArgumentList "Pricing", "Dynamic", @{
            PriceMultiplier = 1.1
            ExpectedVolume = 1.1
        }
    }
    
    # Investment Actions
    static [BusinessAction] InvestRnDLow() {
        return New-Object BusinessAction -ArgumentList "Investment", "RnD_Low", @{
            Amount = 50000
            InnovationBoost = 0.05
        }
    }
    
    static [BusinessAction] InvestRnDMedium() {
        return New-Object BusinessAction -ArgumentList "Investment", "RnD_Medium", @{
            Amount = 150000
            InnovationBoost = 0.15
        }
    }
    
    static [BusinessAction] InvestRnDHigh() {
        return New-Object BusinessAction -ArgumentList "Investment", "RnD_High", @{
            Amount = 300000
            InnovationBoost = 0.30
        }
    }
    
    static [BusinessAction] InvestMarketingLow() {
        return New-Object BusinessAction -ArgumentList "Investment", "Marketing_Low", @{
            Amount = 30000
            BrandBoost = 0.03
            CustomerBoost = 0.05
        }
    }
    
    static [BusinessAction] InvestMarketingMedium() {
        return New-Object BusinessAction -ArgumentList "Investment", "Marketing_Medium", @{
            Amount = 100000
            BrandBoost = 0.08
            CustomerBoost = 0.12
        }
    }
    
    static [BusinessAction] InvestMarketingHigh() {
        return New-Object BusinessAction -ArgumentList "Investment", "Marketing_High", @{
            Amount = 250000
            BrandBoost = 0.15
            CustomerBoost = 0.20
        }
    }
    
    static [BusinessAction] InvestCapExLow() {
        return New-Object BusinessAction -ArgumentList "Investment", "CapEx_Low", @{
            Amount = 100000
            CapacityIncrease = 0.10
        }
    }
    
    static [BusinessAction] InvestCapExHigh() {
        return New-Object BusinessAction -ArgumentList "Investment", "CapEx_High", @{
            Amount = 500000
            CapacityIncrease = 0.50
        }
    }
    
    # Operational Actions
    static [BusinessAction] HireEmployees([int]$count) {
        return New-Object BusinessAction -ArgumentList "Operational", "Hire_$count", @{
            Count = $count
            Cost = $count * 50000  # $50k per employee per year
        }
    }
    
    static [BusinessAction] LayoffEmployees([int]$count) {
        return New-Object BusinessAction -ArgumentList "Operational", "Layoff_$count", @{
            Count = $count
            SeveranceCost = $count * 25000
            ProductivityImpact = -0.1
        }
    }
    
    static [BusinessAction] ImproveQuality() {
        return New-Object BusinessAction -ArgumentList "Operational", "Quality_Improve", @{
            Cost = 80000
            QualityIncrease = 0.10
            TimeMonths = 2
        }
    }
    
    static [BusinessAction] ReduceCosts() {
        return New-Object BusinessAction -ArgumentList "Operational", "Cost_Reduction", @{
            CostSavings = 0.10
            QualityImpact = -0.05
        }
    }
    
    # Strategic Actions
    static [BusinessAction] ExpandMarket() {
        return New-Object BusinessAction -ArgumentList "Strategic", "Market_Expand", @{
            Cost = 200000
            NewCustomerPotential = 0.20
            RiskLevel = 0.3
        }
    }
    
    static [BusinessAction] FormPartnership() {
        return New-Object BusinessAction -ArgumentList "Strategic", "Partnership", @{
            Cost = 50000
            MarketShareBoost = 0.05
            InnovationBoost = 0.10
        }
    }
    
    static [BusinessAction] LaunchProduct() {
        return New-Object BusinessAction -ArgumentList "Strategic", "Product_Launch", @{
            Cost = 150000
            SuccessProbability = 0.6
            RevenueBoost = 0.25
        }
    }
    
    static [BusinessAction] DoNothing() {
        return New-Object BusinessAction -ArgumentList "Strategic", "Hold_Position", @{
            Cost = 0
        }
    }
    
    # Get all available actions (for agent action space)
    static [BusinessAction[]] GetAllActions() {
        return @(
            # Pricing (4 options)
            [BusinessAction]::SetPricePremium(),
            [BusinessAction]::SetPriceCompetitive(),
            [BusinessAction]::SetPricePenetration(),
            [BusinessAction]::SetPriceDynamic(),
            
            # Investment (8 options)
            [BusinessAction]::InvestRnDLow(),
            [BusinessAction]::InvestRnDMedium(),
            [BusinessAction]::InvestRnDHigh(),
            [BusinessAction]::InvestMarketingLow(),
            [BusinessAction]::InvestMarketingMedium(),
            [BusinessAction]::InvestMarketingHigh(),
            [BusinessAction]::InvestCapExLow(),
            [BusinessAction]::InvestCapExHigh(),
            
            # Operational (4 options)
            [BusinessAction]::HireEmployees(5),
            [BusinessAction]::LayoffEmployees(3),
            [BusinessAction]::ImproveQuality(),
            [BusinessAction]::ReduceCosts(),
            
            # Strategic (4 options)
            [BusinessAction]::ExpandMarket(),
            [BusinessAction]::FormPartnership(),
            [BusinessAction]::LaunchProduct(),
            [BusinessAction]::DoNothing()
        )
    }
    
    # Get action names for Q-Learning
    static [string[]] GetActionNames() {
        $actions = [BusinessAction]::GetAllActions()
        return $actions | ForEach-Object { $_.ToString() }
    }
    
    # Get specific action categories
    static [BusinessAction[]] GetPricingActions() {
        return @(
            [BusinessAction]::SetPricePremium(),
            [BusinessAction]::SetPriceCompetitive(),
            [BusinessAction]::SetPricePenetration(),
            [BusinessAction]::SetPriceDynamic()
        )
    }
    
    static [BusinessAction[]] GetInvestmentActions() {
        return @(
            [BusinessAction]::InvestRnDLow(),
            [BusinessAction]::InvestRnDMedium(),
            [BusinessAction]::InvestRnDHigh(),
            [BusinessAction]::InvestMarketingLow(),
            [BusinessAction]::InvestMarketingMedium(),
            [BusinessAction]::InvestMarketingHigh(),
            [BusinessAction]::InvestCapExLow(),
            [BusinessAction]::InvestCapExHigh()
        )
    }
    
    static [BusinessAction[]] GetOperationalActions() {
        return @(
            [BusinessAction]::HireEmployees(5),
            [BusinessAction]::LayoffEmployees(3),
            [BusinessAction]::ImproveQuality(),
            [BusinessAction]::ReduceCosts()
        )
    }
    
    static [BusinessAction[]] GetStrategicActions() {
        return @(
            [BusinessAction]::ExpandMarket(),
            [BusinessAction]::FormPartnership(),
            [BusinessAction]::LaunchProduct(),
            [BusinessAction]::DoNothing()
        )
    }
}