using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SolutionErp.Application.ApprovalWorkflowsV2;

namespace SolutionErp.Api.Controllers;

// Quy trình duyệt MỚI (Mig 22 — Session 17, 2026-05-08).
// Schema riêng để UAT, KHÔNG đụng WorkflowDefinition cũ.
// Authorization split:
//   - GET Overview: chỉ cần authenticated — Drafter cần list workflow để pick
//     lúc create PE/HĐ (read-only, không expose business data nhạy cảm).
//   - POST/DELETE: policy "Workflows.Create" — admin-only Designer.
// Bug fix 2026-05-08: trước class-level "Workflows.Read" → Drafter 403 →
// Workspace dropdown empty silent (không thấy sample workflow đã seed).
[ApiController]
[Route("api/approval-workflows-v2")]
[Authorize]
public class ApprovalWorkflowsV2Controller(IMediator mediator) : ControllerBase
{
    [HttpGet]
    public async Task<ActionResult<AwAdminOverviewDto>> Overview(
        [FromQuery] int? applicableType,
        [FromQuery] bool? isUserSelectable,
        CancellationToken ct)
        => Ok(await mediator.Send(new GetAwAdminOverviewQuery(applicableType, isUserSelectable), ct));

    [HttpPost]
    [Authorize(Policy = "Workflows.Create")]
    public async Task<ActionResult<object>> Create([FromBody] CreateAwDefinitionCommand cmd, CancellationToken ct)
    {
        var id = await mediator.Send(cmd, ct);
        return Ok(new { id });
    }

    // [S155 F-1/F-1a] SỬA TẠI CHỖ quy trình — KHÔNG tăng Version, KHÔNG đụng
    // IsActive, KHÔNG đổi Id. Giữ Id là TOÀN BỘ mục đích: phiếu đang chạy pin
    // ApprovalWorkflowId và đọc workflow SỐNG (PurchaseEvaluationWorkflowService
    // :674 `w.Id == awId`) ⇒ chỉ có sửa-tại-chỗ mới tới được phiếu đang treo.
    // Chỉ nhận thay đổi hạng AN TOÀN; handler thi hành 2 phép thử (T1) khung
    // không đổi + (T2) luật chơi không đổi, vi phạm ⇒ 409.
    // 🔴 Policy BẮT BUỘC — khớp 3 verb ghi còn lại của controller này. Thiếu nó =
    // leo thang đặc quyền: thêm mình vào một Cấp ⇒ duyệt phiếu người khác;
    // bật cờ F6 ⇒ tự cấp quyền xoá phiếu đang duyệt.
    [HttpPut("{id:guid}")]
    [Authorize(Policy = "Workflows.Create")]
    public async Task<IActionResult> Update(Guid id, [FromBody] UpdateAwDefinitionCommand cmd, CancellationToken ct)
    {
        await mediator.Send(cmd with { Id = id }, ct);
        return NoContent();
    }

    public record SetUserSelectableBody(bool IsUserSelectable);

    // Mig 25 — admin toggle stick/unstick "cho user pick lúc create phiếu".
    [HttpPatch("{id:guid}/user-selectable")]
    [Authorize(Policy = "Workflows.Create")]
    public async Task<IActionResult> SetUserSelectable(Guid id, [FromBody] SetUserSelectableBody body, CancellationToken ct)
    {
        await mediator.Send(new SetAwUserSelectableCommand(id, body.IsUserSelectable), ct);
        return NoContent();
    }

    [HttpDelete("{id:guid}")]
    [Authorize(Policy = "Workflows.Create")]
    public async Task<IActionResult> Delete(Guid id, CancellationToken ct)
    {
        await mediator.Send(new DeleteAwDefinitionCommand(id), ct);
        return NoContent();
    }
}
