using Management.Data; using Management.Security; using Microsoft.AspNetCore.Mvc; using System.Text.Json; namespace Management.Controllers.Admin; /// /// Admin endpoints for campaign performance reporting and intelligence. /// Provides normalized metrics across all providers (Google, Meta, TikTok). /// Requires Admin role. /// /// ENDPOINTS: /// POST /api/admin/reporting/summary - KPI summary across all campaigns /// POST /api/admin/reporting/campaigns - Per-campaign performance metrics /// GET /api/admin/reporting/campaigns/{id} - Detailed metrics for one initiative /// POST /api/admin/reporting/insights - Optimization recommendations /// POST /api/admin/reporting/analysis - Post-campaign analysis data /// [ApiController] [Route("api/admin/reporting")] public sealed class AdminReportingController : AdminControllerBase { public AdminReportingController(SqlService sql, ClientContext client, ILogger log) : base(sql, client, log) { } /// /// KPI summary: totals for spend, impressions, clicks, conversions, CTR, CPC, ROAS. /// Body: { dateFrom?, dateTo?, clientId? } /// [HttpPost("summary")] public Task Summary([FromBody] JsonElement body, CancellationToken ct) => CallProc("spAdminReporting", "summary", body.ToString(), ct); /// /// Per-campaign performance list with channel breakdowns. /// Body: { status?, clientId?, dateFrom?, dateTo?, sortBy?, sortDir?, page?, pageSize? } /// [HttpPost("campaigns")] public Task Campaigns([FromBody] JsonElement body, CancellationToken ct) => CallProc("spAdminReporting", "campaigns", body.ToString(), ct); /// /// Detailed metrics for a single initiative with daily time-series /// and per-channel breakdowns. /// [HttpGet("campaigns/{initiativeId:long}")] public Task CampaignDetail(long initiativeId, CancellationToken ct) => CallProc("spAdminReporting", "detail", new { initiativeId }, ct); /// /// Optimization insights and recommendations. /// Body: { severity?, clientId? } /// [HttpPost("insights")] public Task Insights([FromBody] JsonElement body, CancellationToken ct) => CallProc("spAdminReporting", "insights", body.ToString(), ct); /// /// Post-campaign analysis: completed campaigns with ROI, cost-efficiency, /// and channel-level performance comparisons. /// Body: { clientId?, dateFrom?, dateTo? } /// [HttpPost("analysis")] public Task Analysis([FromBody] JsonElement body, CancellationToken ct) => CallProc("spAdminReporting", "analysis", body.ToString(), ct); }