using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SolutionErp.Application.Reports.Commands.ExportContractsToExcel;
using SolutionErp.Application.Reports.Dtos;
using SolutionErp.Application.Reports.Queries.GetDashboardStats;
using SolutionErp.Application.Reports.Queries.GetMyDashboard;
using SolutionErp.Domain.Contracts;

namespace SolutionErp.Api.Controllers;

[ApiController]
[Route("api/reports")]
[Authorize]
public class ReportsController(IMediator mediator) : ControllerBase
{
    // [S118 — reviewer catch] Báo cáo TOÀN CÔNG TY (tổng giá trị HĐ, top NCC/dự án theo giá trị,
    // xu hướng 12 tháng) = nhạy cảm → gate Reports.Read (owner chốt: chỉ Admin, khớp S92 "HĐ chỉ
    // Admin thấy"). Hiện chỉ Admin có Reports.Read → non-admin 403. Mở cho role khác = cấp Reports.Read
    // qua ma trận (không sửa code). Trước S118: chỉ [Authorize] trần → mọi user đăng nhập gọi được.
    [HttpGet("dashboard")]
    [Authorize(Policy = "Reports.Read")]
    public async Task<ActionResult<DashboardStatsDto>> Dashboard(CancellationToken ct)
        => Ok(await mediator.Send(new GetDashboardStatsQuery(), ct));

    // GIỮ MỞ (chỉ [Authorize] class-level): my-dashboard scope theo currentUser.UserId — mỗi user
    // chỉ thấy số của CHÍNH MÌNH (draft/pending/SLA/giá trị draft của mình). Không lộ toàn công ty.
    [HttpGet("my-dashboard")]
    public async Task<ActionResult<MyDashboardDto>> MyDashboard(CancellationToken ct)
        => Ok(await mediator.Send(new GetMyDashboardQuery(), ct));

    // [S118 — reviewer catch] Xuất TOÀN BỘ HĐ ra Excel = nhạy cảm → gate Reports.Read (chỉ Admin, S92).
    [HttpGet("contracts/export")]
    [Authorize(Policy = "Reports.Read")]
    public async Task<IActionResult> ExportContracts(
        [FromQuery] ContractPhase? phase,
        [FromQuery] Guid? supplierId,
        [FromQuery] Guid? projectId,
        [FromQuery] DateTime? fromDate,
        [FromQuery] DateTime? toDate,
        CancellationToken ct)
    {
        var result = await mediator.Send(new ExportContractsToExcelCommand(phase, supplierId, projectId, fromDate, toDate), ct);
        return File(result.Content, result.ContentType, result.FileName);
    }
}
