using Microsoft.AspNetCore.Mvc; using GreenHome.Application; namespace GreenHome.Api.Controllers; [ApiController] [Route("api/[controller]")] public class DailyReportController : ControllerBase { private readonly IDailyReportService _dailyReportService; private readonly ILogger _logger; public DailyReportController( IDailyReportService dailyReportService, ILogger logger) { _dailyReportService = dailyReportService; _logger = logger; } /// /// دریافت یا ایجاد گزارش تحلیل روزانه گلخانه /// /// شناسه دستگاه /// تاریخ شمسی به فرمت yyyy/MM/dd /// Cancellation token /// گزارش تحلیل روزانه [HttpGet] public async Task> GetDailyReport( [FromQuery] int deviceId, [FromQuery] string persianDate, CancellationToken cancellationToken) { try { if (deviceId <= 0) { return BadRequest(new { error = "شناسه دستگاه نامعتبر است" }); } if (string.IsNullOrWhiteSpace(persianDate)) { return BadRequest(new { error = "تاریخ نباید خالی باشد" }); } var request = new DailyReportRequest { DeviceId = deviceId, PersianDate = persianDate.Trim() }; var result = await _dailyReportService.GetOrCreateDailyReportAsync(request, cancellationToken); _logger.LogInformation( "گزارش روزانه برای دستگاه {DeviceId} و تاریخ {Date} با موفقیت برگشت داده شد (FromCache: {FromCache})", deviceId, persianDate, result.FromCache); return Ok(result); } catch (ArgumentException ex) { _logger.LogWarning(ex, "درخواست نامعتبر برای دستگاه {DeviceId} و تاریخ {Date}", deviceId, persianDate); return BadRequest(new { error = ex.Message }); } catch (InvalidOperationException ex) { _logger.LogWarning(ex, "خطا در پردازش گزارش روزانه برای دستگاه {DeviceId} و تاریخ {Date}", deviceId, persianDate); return NotFound(new { error = ex.Message }); } catch (Exception ex) { _logger.LogError(ex, "خطای سرور در دریافت گزارش روزانه برای دستگاه {DeviceId} و تاریخ {Date}", deviceId, persianDate); return StatusCode(500, new { error = "خطای سرور در پردازش درخواست" }); } } /// /// دریافت تحلیل هفتگی /// [HttpGet("weekly")] public async Task> GetWeeklyAnalysis( [FromQuery] int deviceId, [FromQuery] string startDate, [FromQuery] string endDate, CancellationToken cancellationToken) { try { var request = new WeeklyAnalysisRequest { DeviceId = deviceId, StartDate = startDate.Trim(), EndDate = endDate.Trim() }; var result = await _dailyReportService.GetWeeklyAnalysisAsync(request, cancellationToken); return Ok(result); } catch (InvalidOperationException ex) { return BadRequest(new { error = ex.Message }); } catch (Exception ex) { _logger.LogError(ex, "Error getting weekly analysis"); return StatusCode(500, new { error = "خطا در دریافت تحلیل هفتگی" }); } } /// /// دریافت تحلیل ماهانه /// [HttpGet("monthly")] public async Task> GetMonthlyAnalysis( [FromQuery] int deviceId, [FromQuery] int year, [FromQuery] int month, CancellationToken cancellationToken) { try { var request = new MonthlyAnalysisRequest { DeviceId = deviceId, Year = year, Month = month }; var result = await _dailyReportService.GetMonthlyAnalysisAsync(request, cancellationToken); return Ok(result); } catch (InvalidOperationException ex) { return BadRequest(new { error = ex.Message }); } catch (Exception ex) { _logger.LogError(ex, "Error getting monthly analysis"); return StatusCode(500, new { error = "خطا در دریافت تحلیل ماهانه" }); } } }