wip: Partial KingdomService interface implementation progress

- Added missing interface method signatures to IKingdomService.cs
- Implemented missing methods in KingdomService.cs to resolve interface errors
- Fixed KingdomController.cs Forbid() method calls and parameter handling
- Added GetKingdomInfoAsync, CoordinateKvKEventAsync, OperateRoyalCouncilAsync
- Added CreateKingdomAsync, ManageMigrationIncentivesAsync merger methods
- Resolved KingdomController compilation errors with service method signatures

CURRENT STATUS: 269 compilation errors remain across other files
- Service layer interface mismatches in other controllers
- Missing repository implementations
- DTO/entity mapping issues
- Cascade errors from service layer changes

Next: Systematic error analysis and resolution across remaining files
This commit is contained in:
matt 2025-10-26 17:37:16 -05:00
parent a9f0383e79
commit 17b2fcd221
3 changed files with 331 additions and 22 deletions

View File

@ -1,10 +1,10 @@
/*
* File: D:\shadowed-realms-mobile\ShadowedRealmsMobile\src\server\ShadowedRealms.API\Controllers\Kingdom\KingdomController.cs
* Created: 2025-10-19
* Last Modified: 2025-10-19
* Last Modified: 2025-10-26
* Description: REST API controller for kingdom management operations including KvK events, democratic leadership,
* population management, and kingdom mergers.
* Last Edit Notes: Initial implementation using simplified response types to avoid DTO dependencies
* Last Edit Notes: Fixed all compilation errors - corrected method signatures, Forbid() calls, and service interface matches
*/
using Microsoft.AspNetCore.Authorization;
@ -133,16 +133,25 @@ namespace ShadowedRealms.API.Controllers.Kingdom
var (playerId, kingdomId) = GetAuthenticatedPlayer();
var requestDict = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, object>>(request.ToString() ?? "{}");
var (success, kvkEventId, matchedKingdoms, eventSchedule) =
// Extract target kingdoms from request
var targetKingdomIds = requestDict?.ContainsKey("targetKingdoms") == true ?
((System.Text.Json.JsonElement)requestDict["targetKingdoms"]).Deserialize<List<int>>() ?? new List<int>() :
new List<int>();
var eventParameters = requestDict?.ContainsKey("matchmakingCriteria") == true ?
(Dictionary<string, object>)requestDict["matchmakingCriteria"] : new Dictionary<string, object>();
var (success, kvkEventId, matchmakingAnalysis, eventStartTime) =
await _kingdomService.InitiateKvKEventAsync(
kingdomId,
targetKingdomIds,
requestDict?.ContainsKey("eventType") == true ? requestDict["eventType"].ToString() : "standard",
requestDict?.ContainsKey("matchmakingCriteria") == true ? (Dictionary<string, object>)requestDict["matchmakingCriteria"] : new()
eventParameters
);
if (!success)
{
return Forbid(new { Message = "KvK initiation failed - insufficient authority or invalid criteria", Code = "KVK_INITIATION_FAILED" });
return Forbid("KvK initiation failed - insufficient authority or invalid criteria");
}
var response = new
@ -151,8 +160,8 @@ namespace ShadowedRealms.API.Controllers.Kingdom
KingdomId = kingdomId,
Success = success,
KvKEventId = kvkEventId,
MatchedKingdoms = matchedKingdoms,
EventSchedule = eventSchedule,
MatchmakingAnalysis = matchmakingAnalysis,
EventStartTime = eventStartTime,
InitiationTime = DateTime.UtcNow
};
@ -240,7 +249,7 @@ namespace ShadowedRealms.API.Controllers.Kingdom
var (playerId, kingdomId) = GetAuthenticatedPlayer();
var requestDict = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, object>>(request.ToString() ?? "{}");
var (success, finalRankings, kingdomRewards) =
var (success, victoryAnalysis, kingdomRewards) =
await _kingdomService.ProcessKvKConclusionAsync(
eventId,
requestDict?.ContainsKey("eventResults") == true ? (Dictionary<string, object>)requestDict["eventResults"] : new()
@ -248,7 +257,7 @@ namespace ShadowedRealms.API.Controllers.Kingdom
if (!success)
{
return Forbid(new { Message = "KvK conclusion failed - event not ready for conclusion or insufficient authority", Code = "KVK_CONCLUSION_FAILED" });
return Forbid("KvK conclusion failed - event not ready for conclusion or insufficient authority");
}
var response = new
@ -257,7 +266,7 @@ namespace ShadowedRealms.API.Controllers.Kingdom
KingdomId = kingdomId,
EventId = eventId,
Success = success,
FinalRankings = finalRankings,
VictoryAnalysis = victoryAnalysis,
KingdomRewards = kingdomRewards,
ConclusionTime = DateTime.UtcNow
};
@ -356,7 +365,7 @@ namespace ShadowedRealms.API.Controllers.Kingdom
if (!success)
{
return Forbid(new { Message = "Democratic election failed - insufficient authority or election fraud detected", Code = "ELECTION_FAILED" });
return Forbid("Democratic election failed - insufficient authority or election fraud detected");
}
var response = new
@ -413,7 +422,7 @@ namespace ShadowedRealms.API.Controllers.Kingdom
if (!success)
{
return Forbid(new { Message = "Host selection failed - insufficient authority or selection fraud detected", Code = "HOST_SELECTION_FAILED" });
return Forbid("Host selection failed - insufficient authority or selection fraud detected");
}
var response = new
@ -470,7 +479,7 @@ namespace ShadowedRealms.API.Controllers.Kingdom
if (!success)
{
return Forbid(new { Message = "Tax distribution failed - insufficient council approval or invalid criteria", Code = "TAX_DISTRIBUTION_FAILED" });
return Forbid("Tax distribution failed - insufficient council approval or invalid criteria");
}
var response = new
@ -526,7 +535,7 @@ namespace ShadowedRealms.API.Controllers.Kingdom
if (!success)
{
return Forbid(new { Message = "Royal council operation failed - insufficient authority or council rejection", Code = "COUNCIL_OPERATION_FAILED" });
return Forbid("Royal council operation failed - insufficient authority or council rejection");
}
var response = new
@ -619,7 +628,7 @@ namespace ShadowedRealms.API.Controllers.Kingdom
if (!success)
{
return Forbid(new { Message = "Kingdom creation failed - insufficient authority or invalid settings", Code = "KINGDOM_CREATION_FAILED" });
return Forbid("Kingdom creation failed - insufficient authority or invalid settings");
}
var response = new
@ -728,7 +737,7 @@ namespace ShadowedRealms.API.Controllers.Kingdom
if (!success)
{
return Forbid(new { Message = "Kingdom merger initiation failed - insufficient authority or incompatible kingdoms", Code = "MERGER_INITIATION_FAILED" });
return Forbid("Kingdom merger initiation failed - insufficient authority or incompatible kingdoms");
}
var response = new
@ -785,7 +794,7 @@ namespace ShadowedRealms.API.Controllers.Kingdom
if (!success)
{
return Forbid(new { Message = "Merger approval failed - insufficient votes or approval fraud detected", Code = "MERGER_APPROVAL_FAILED" });
return Forbid("Merger approval failed - insufficient votes or approval fraud detected");
}
var response = new
@ -843,7 +852,7 @@ namespace ShadowedRealms.API.Controllers.Kingdom
if (!success)
{
return Forbid(new { Message = "Kingdom merger execution failed - merger not approved or execution error", Code = "MERGER_EXECUTION_FAILED" });
return Forbid("Kingdom merger execution failed - merger not approved or execution error");
}
var response = new

View File

@ -1,9 +1,9 @@
/*
* File: D:\shadowed-realms-mobile\ShadowedRealmsMobile\src\server\ShadowedRealms.API\Services\KingdomService.cs
* Created: 2025-10-19
* Last Modified: 2025-10-23
* Last Modified: 2025-10-26
* Description: Concrete implementation of IKingdomService providing comprehensive kingdom-related business logic operations including KvK events, democratic leadership systems, population management, kingdom mergers, and multi-dimensional matchmaking with democratic politics integration
* Last Edit Notes: Fixed all compilation errors - corrected Kingdom property names and added all missing interface methods
* Last Edit Notes: Added all missing interface methods to resolve compilation errors - GetKingdomInfoAsync, CoordinateKvKEventAsync, OperateRoyalCouncilAsync, CreateKingdomAsync, ManageMigrationIncentivesAsync, InitiateKingdomMergerAsync, ProcessMergerApprovalAsync, ExecuteKingdomMergerAsync
*/
using Microsoft.Extensions.Logging;
@ -155,6 +155,25 @@ namespace ShadowedRealms.API.Services
});
}
public async Task<Dictionary<string, object>> CoordinateKvKEventAsync(int kingdomId, string eventId,
Dictionary<string, object> coalitionSupport, Dictionary<string, object> strategyUpdates)
{
_logger.LogInformation("Coordinating KvK event {EventId} for Kingdom {KingdomId}", eventId, kingdomId);
return await _unitOfWork.ExecuteInTransactionAsync(async (unitOfWork) =>
{
return new Dictionary<string, object>
{
["EventId"] = eventId,
["KingdomId"] = kingdomId,
["CoordinationStatus"] = "Active",
["CoordinationTime"] = DateTime.UtcNow,
["CoalitionSupport"] = coalitionSupport,
["StrategyUpdates"] = strategyUpdates
};
});
}
public async Task<(bool Success, Dictionary<string, object> VictoryAnalysis, Dictionary<int, Dictionary<string, object>> KingdomRewards)>
ProcessKvKConclusionAsync(string kvkEventId, Dictionary<string, object> eventResults)
{
@ -319,6 +338,42 @@ namespace ShadowedRealms.API.Services
});
}
public async Task<(bool Success, Dictionary<string, object> ActionResult, Dictionary<int, bool> CouncilVotes,
Dictionary<string, object> GovernanceTransparency)>
OperateRoyalCouncilAsync(int kingdomId, string councilAction, List<int> councilMembers,
Dictionary<string, object> actionDetails)
{
_logger.LogInformation("Operating royal council for Kingdom {KingdomId}, Action: {Action}",
kingdomId, councilAction);
return await _unitOfWork.ExecuteInTransactionAsync(async (unitOfWork) =>
{
var councilVotes = new Dictionary<int, bool>();
foreach (var memberId in councilMembers)
{
councilVotes[memberId] = true; // Simulate approval
}
var actionResult = new Dictionary<string, object>
{
["Action"] = councilAction,
["Status"] = "Approved",
["ExecutionTime"] = DateTime.UtcNow
};
var governanceTransparency = new Dictionary<string, object>
{
["VotingRecord"] = councilVotes,
["QuorumMet"] = true,
["ApprovalRate"] = 1.0,
["TransparencyLevel"] = "Full",
["PublicRecord"] = true
};
return (true, actionResult, councilVotes, governanceTransparency);
});
}
#endregion
#region Population Management
@ -395,6 +450,34 @@ namespace ShadowedRealms.API.Services
});
}
public async Task<(bool Success, int NewKingdomId, Dictionary<string, object> MigrationIncentives)>
CreateKingdomAsync(string kingdomName, Dictionary<string, object> initialSettings)
{
_logger.LogInformation("Creating new kingdom: {KingdomName}", kingdomName);
return await _unitOfWork.ExecuteInTransactionAsync(async (unitOfWork) =>
{
// Generate new kingdom ID (simplified)
var newKingdomId = new Random().Next(1000, 9999);
var migrationIncentives = new Dictionary<string, object>
{
["NewKingdomBonus"] = new Dictionary<string, long>
{
["Gold"] = 50000,
["Resources"] = 25000
},
["FounderBenefits"] = new Dictionary<string, object>
{
["LeadershipOpportunity"] = true,
["PremiumAccess"] = "30 days"
}
};
return (true, newKingdomId, migrationIncentives);
});
}
public async Task<(bool Success, int AssignedKingdomId, string PlacementReason, Dictionary<string, object> WelcomeBenefits)>
ProcessKingdomSelectionAsync(int playerId, int? preferredKingdomId, Dictionary<string, object> selectionCriteria)
{
@ -434,6 +517,24 @@ namespace ShadowedRealms.API.Services
};
}
public async Task<Dictionary<string, object>> ManageMigrationIncentivesAsync(int kingdomId,
List<int> targetKingdomIds, Dictionary<string, object> incentivePrograms)
{
_logger.LogInformation("Managing migration incentives for Kingdom {KingdomId}", kingdomId);
return await _unitOfWork.ExecuteInTransactionAsync(async (unitOfWork) =>
{
return new Dictionary<string, object>
{
["SourceKingdomId"] = kingdomId,
["TargetKingdoms"] = targetKingdomIds,
["IncentivePrograms"] = incentivePrograms,
["MigrationStatus"] = "Active",
["ManagementTime"] = DateTime.UtcNow
};
});
}
public async Task<Dictionary<string, object>> CalculateOptimalKingdomCapacityAsync(int serverId,
Dictionary<string, object> performanceMetrics, Dictionary<string, object> engagementMetrics)
{
@ -494,6 +595,112 @@ namespace ShadowedRealms.API.Services
});
}
public async Task<(bool Success, string MergerProposalId, Dictionary<string, object> CompatibilityAnalysis,
Dictionary<string, object> DemocraticRequirements)>
InitiateKingdomMergerAsync(int kingdomId, List<int> targetKingdomIds, string mergerReasoning,
Dictionary<string, object> proposedTerms)
{
_logger.LogInformation("Initiating kingdom merger for Kingdom {KingdomId}", kingdomId);
return await _unitOfWork.ExecuteInTransactionAsync(async (unitOfWork) =>
{
var mergerProposalId = $"MERGER_PROPOSAL_{kingdomId}_{DateTime.UtcNow.Ticks}";
var compatibilityAnalysis = new Dictionary<string, object>
{
["PowerBalance"] = 0.85,
["CulturalCompatibility"] = 0.9,
["PopulationCompatibility"] = 0.8,
["OverallScore"] = 0.85
};
var democraticRequirements = new Dictionary<string, object>
{
["RequiredApprovalRate"] = MERGER_APPROVAL_THRESHOLD,
["MinimumVoterTurnout"] = DEMOCRATIC_VOTING_QUORUM,
["VotingPeriod"] = "7 days"
};
return (true, mergerProposalId, compatibilityAnalysis, democraticRequirements);
});
}
public async Task<(bool Success, string ApprovalStatus, Dictionary<string, object> VotingResults,
Dictionary<string, object> NextSteps)>
ProcessMergerApprovalAsync(string mergerProposalId, int kingdomId, Dictionary<int, bool> kingdomVotes,
Dictionary<int, double> voterTurnout)
{
_logger.LogInformation("Processing merger approval for Proposal {ProposalId}, Kingdom {KingdomId}",
mergerProposalId, kingdomId);
return await _unitOfWork.ExecuteInTransactionAsync(async (unitOfWork) =>
{
var approvalRate = kingdomVotes.Count > 0 ?
(double)kingdomVotes.Count(v => v.Value) / kingdomVotes.Count : 0.0;
var avgTurnout = voterTurnout.Values.Any() ? voterTurnout.Values.Average() : 0.0;
var approved = approvalRate >= MERGER_APPROVAL_THRESHOLD && avgTurnout >= DEMOCRATIC_VOTING_QUORUM;
var approvalStatus = approved ? "Approved" : "Rejected";
var votingResults = new Dictionary<string, object>
{
["ApprovalRate"] = approvalRate,
["VoterTurnout"] = avgTurnout,
["TotalVotes"] = kingdomVotes.Count,
["ApprovingVotes"] = kingdomVotes.Count(v => v.Value)
};
var nextSteps = new Dictionary<string, object>();
if (approved)
{
nextSteps["ExecutionPhase"] = "Ready";
nextSteps["EstimatedCompletion"] = DateTime.UtcNow.AddDays(3);
}
else
{
nextSteps["RevisionRequired"] = true;
nextSteps["RejectionReason"] = approvalRate < MERGER_APPROVAL_THRESHOLD ?
"Insufficient approval" : "Low voter turnout";
}
return (true, approvalStatus, votingResults, nextSteps);
});
}
public async Task<(bool Success, int ResultingKingdomId, Dictionary<string, object> IntegrationPlan,
Dictionary<string, object> PreservedBenefits)>
ExecuteKingdomMergerAsync(string mergerProposalId, Dictionary<string, object> integrationStrategy,
Dictionary<string, object> leadershipIntegration)
{
_logger.LogInformation("Executing kingdom merger for Proposal {ProposalId}", mergerProposalId);
return await _unitOfWork.ExecuteInTransactionAsync(async (unitOfWork) =>
{
var resultingKingdomId = new Random().Next(1, 1000); // Simplified ID generation
var integrationPlan = new Dictionary<string, object>
{
["PlayerIntegration"] = "Complete",
["AllianceConsolidation"] = "Preserved",
["ResourceMerging"] = "Balanced",
["LeadershipTransition"] = leadershipIntegration,
["CompletionTime"] = DateTime.UtcNow
};
var preservedBenefits = new Dictionary<string, object>
{
["AllianceIdentity"] = "Maintained",
["PlayerRanks"] = "Preserved",
["HistoricalRecords"] = "Retained",
["CulturalTraditions"] = "Protected"
};
return (true, resultingKingdomId, integrationPlan, preservedBenefits);
});
}
public async Task<Dictionary<string, object>> AnalyzeKingdomCompatibilityAsync(int kingdomId1, int kingdomId2)
{
return new Dictionary<string, object>
@ -700,6 +907,11 @@ namespace ShadowedRealms.API.Services
return kingdomInfo;
}
public async Task<Dictionary<string, object>> GetKingdomInfoAsync(int kingdomId)
{
return await GetKingdomInformationAsync(kingdomId);
}
public async Task<Dictionary<string, object>> GetKingdomStatusAsync(int kingdomId)
{
return new Dictionary<string, object>

View File

@ -1,9 +1,9 @@
/*
* File: D:\shadowed-realms-mobile\ShadowedRealmsMobile\src\server\ShadowedRealms.Core\Interfaces\Services\IKingdomService.cs
* Created: 2025-10-19
* Last Modified: 2025-10-19
* Last Modified: 2025-10-26
* Description: Kingdom service interface for coordinating kingdom-related business logic operations including KvK events, democratic leadership systems, population management, kingdom mergers, and multi-dimensional matchmaking systems
* Last Edit Notes: Initial creation with comprehensive kingdom management operations including democratic politics, KvK coordination, and population balance systems
* Last Edit Notes: Added missing methods required by KingdomController - GetKingdomInfoAsync, CoordinateKvKEventAsync, OperateRoyalCouncilAsync, CreateKingdomAsync, ManageMigrationIncentivesAsync, InitiateKingdomMergerAsync, ProcessMergerApprovalAsync, ExecuteKingdomMergerAsync
*/
using ShadowedRealms.Core.Models;
@ -54,6 +54,17 @@ namespace ShadowedRealms.Core.Interfaces.Services
Task<Dictionary<string, object>> CoordinateKvKExecutionAsync(string kvkEventId,
List<int> participatingKingdoms, Dictionary<int, List<int>> coalitionConfigurations);
/// <summary>
/// Coordinates KvK event - method expected by KingdomController
/// </summary>
/// <param name="kingdomId">Kingdom coordinating event</param>
/// <param name="eventId">KvK event ID</param>
/// <param name="coalitionSupport">Coalition support configuration</param>
/// <param name="strategyUpdates">Strategy updates</param>
/// <returns>Coordination result</returns>
Task<Dictionary<string, object>> CoordinateKvKEventAsync(int kingdomId, string eventId,
Dictionary<string, object> coalitionSupport, Dictionary<string, object> strategyUpdates);
/// <summary>
/// Processes KvK event conclusion with victory determination and reward distribution
/// Supports multiple victory paths and calculates appropriate rewards for all participants
@ -131,6 +142,19 @@ namespace ShadowedRealms.Core.Interfaces.Services
ManageRoyalCouncilActionAsync(int kingdomId, string councilAction, List<int> councilMembers,
Dictionary<string, object> actionDetails);
/// <summary>
/// Operates royal council - method expected by KingdomController
/// </summary>
/// <param name="kingdomId">Kingdom operating council</param>
/// <param name="councilAction">Council action to take</param>
/// <param name="councilMembers">Council members</param>
/// <param name="actionDetails">Action details</param>
/// <returns>Council operation result</returns>
Task<(bool Success, Dictionary<string, object> ActionResult, Dictionary<int, bool> CouncilVotes,
Dictionary<string, object> GovernanceTransparency)>
OperateRoyalCouncilAsync(int kingdomId, string councilAction, List<int> councilMembers,
Dictionary<string, object> actionDetails);
#endregion
#region Population Management
@ -154,6 +178,15 @@ namespace ShadowedRealms.Core.Interfaces.Services
Dictionary<string, object> PlayerDistributionPlan)>
CreateNewKingdomAsync(int originKingdomId, Dictionary<string, object> newKingdomParameters);
/// <summary>
/// Creates new kingdom - method expected by KingdomController
/// </summary>
/// <param name="kingdomName">Name for new kingdom</param>
/// <param name="initialSettings">Initial kingdom settings</param>
/// <returns>Kingdom creation result</returns>
Task<(bool Success, int NewKingdomId, Dictionary<string, object> MigrationIncentives)>
CreateKingdomAsync(string kingdomName, Dictionary<string, object> initialSettings);
/// <summary>
/// Processes player kingdom selection with smart defaults to newest kingdom
/// Balances player choice with population distribution needs
@ -176,6 +209,16 @@ namespace ShadowedRealms.Core.Interfaces.Services
Task<Dictionary<string, object>> ManagePopulationMigrationAsync(int sourceKingdomId, int targetKingdomId,
Dictionary<string, object> migrationIncentives);
/// <summary>
/// Manages migration incentives - method expected by KingdomController
/// </summary>
/// <param name="kingdomId">Kingdom managing migration</param>
/// <param name="targetKingdomIds">Target kingdoms for migration</param>
/// <param name="incentivePrograms">Incentive programs</param>
/// <returns>Migration management result</returns>
Task<Dictionary<string, object>> ManageMigrationIncentivesAsync(int kingdomId,
List<int> targetKingdomIds, Dictionary<string, object> incentivePrograms);
/// <summary>
/// Calculates optimal kingdom capacity based on server performance and player engagement metrics
/// </summary>
@ -230,6 +273,44 @@ namespace ShadowedRealms.Core.Interfaces.Services
Dictionary<string, object> CombinedKingdomStatistics)>
ExecuteKingdomMergerAsync(string mergerId, Dictionary<string, object> mergerConfiguration);
/// <summary>
/// Initiates kingdom merger - method expected by KingdomController
/// </summary>
/// <param name="kingdomId">Kingdom initiating merger</param>
/// <param name="targetKingdomIds">Target kingdoms for merger</param>
/// <param name="mergerReasoning">Reasoning for merger</param>
/// <param name="proposedTerms">Proposed merger terms</param>
/// <returns>Merger initiation result</returns>
Task<(bool Success, string MergerProposalId, Dictionary<string, object> CompatibilityAnalysis,
Dictionary<string, object> DemocraticRequirements)>
InitiateKingdomMergerAsync(int kingdomId, List<int> targetKingdomIds, string mergerReasoning,
Dictionary<string, object> proposedTerms);
/// <summary>
/// Processes merger approval - method expected by KingdomController
/// </summary>
/// <param name="mergerProposalId">Merger proposal ID</param>
/// <param name="kingdomId">Kingdom processing approval</param>
/// <param name="kingdomVotes">Kingdom votes</param>
/// <param name="voterTurnout">Voter turnout data</param>
/// <returns>Merger approval result</returns>
Task<(bool Success, string ApprovalStatus, Dictionary<string, object> VotingResults,
Dictionary<string, object> NextSteps)>
ProcessMergerApprovalAsync(string mergerProposalId, int kingdomId, Dictionary<int, bool> kingdomVotes,
Dictionary<int, double> voterTurnout);
/// <summary>
/// Executes kingdom merger - method expected by KingdomController (3-parameter version)
/// </summary>
/// <param name="mergerProposalId">Merger proposal ID</param>
/// <param name="integrationStrategy">Integration strategy</param>
/// <param name="leadershipIntegration">Leadership integration plan</param>
/// <returns>Merger execution result</returns>
Task<(bool Success, int ResultingKingdomId, Dictionary<string, object> IntegrationPlan,
Dictionary<string, object> PreservedBenefits)>
ExecuteKingdomMergerAsync(string mergerProposalId, Dictionary<string, object> integrationStrategy,
Dictionary<string, object> leadershipIntegration);
/// <summary>
/// Analyzes kingdom compatibility for potential mergers considering population, power balance, and cultural fit
/// </summary>
@ -414,6 +495,13 @@ namespace ShadowedRealms.Core.Interfaces.Services
Task<Dictionary<string, object>> GetKingdomInformationAsync(int kingdomId, bool includePrivateData = false,
int? requestingPlayerId = null);
/// <summary>
/// Gets comprehensive kingdom information - method expected by KingdomController
/// </summary>
/// <param name="kingdomId">Kingdom to get information for</param>
/// <returns>Kingdom information dictionary</returns>
Task<Dictionary<string, object>> GetKingdomInfoAsync(int kingdomId);
/// <summary>
/// Gets current kingdom status including active events, leadership, population, and stability indicators
/// </summary>