using Microsoft.AspNetCore.Mvc; using CodePlay.Core.Models; using CodePlay.Core.Services; using System.Collections.Concurrent; namespace CodePlay.WebAPI.Controllers; [ApiController] [Route("api/[controller]")] public class ReportController : ControllerBase { private static readonly ConcurrentDictionary _reports = new(); private readonly ILogger _logger; public ReportController(ILogger logger) { _logger = logger; } [HttpPost] public ActionResult CreateReport([FromBody] ConversionReport report) { report.Id = Guid.NewGuid().ToString("N")[..20]; report.CreatedAt = DateTime.UtcNow; _reports[report.Id] = report; _logger.LogInformation("创建转换报告:{Id}", report.Id); return Created($"/api/reports/{report.Id}", report); } [HttpGet] public ActionResult> GetReports([FromQuery] int limit = 50) { return _reports.Values .OrderByDescending(r => r.CreatedAt) .Take(limit) .ToList(); } [HttpGet("{id}")] public ActionResult GetReport(string id) { if (!_reports.TryGetValue(id, out var report)) return NotFound(); return Ok(report); } [HttpGet("project/{projectId}")] public ActionResult> GetReportsByProject(string projectId) { var reports = _reports.Values .Where(r => r.ProjectId == projectId) .OrderByDescending(r => r.CreatedAt) .ToList(); return reports; } [HttpGet("stats")] public ActionResult GetStatistics() { var reports = _reports.Values.ToList(); return Ok(new { TotalReports = reports.Count, TotalLines = reports.Sum(r => r.LinesConverted), TotalIssues = reports.Sum(r => r.IssueCount), TotalTODOs = reports.Sum(r => r.TodoCount), AvgLinesPerConversion = reports.Count > 0 ? reports.Average(r => r.LinesConverted) : 0, ByLanguage = reports.GroupBy(r => $"{r.SourceLanguage}->{r.TargetLanguage}") .Select(g => new { Conversion = g.Key, Count = g.Count() }) }); } [HttpDelete("{id}")] public IActionResult DeleteReport(string id) { if (_reports.TryRemove(id, out _)) return NoContent(); return NotFound(); } }