using FlatRender.ContentSvc.Application.Services;
using FlatRender.ContentSvc.Models.Requests;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace FlatRender.ContentSvc.Controllers;

[ApiController]
[Route("v1/templates")]
public class TemplatesController(TemplateService svc) : ControllerBase
{
    // ── Containers ────────────────────────────────────────────────────────────

    [HttpGet]
    public async Task<IActionResult> ListContainers([FromQuery] ContainerListRequest req) =>
        Ok(await svc.GetContainersAsync(req));

    [HttpGet("{slug}")]
    public async Task<IActionResult> GetContainer(string slug)
    {
        await svc.IncrementContainerViewAsync(
            (await svc.GetContainerBySlugAsync(slug)).Id);
        return Ok(await svc.GetContainerBySlugAsync(slug));
    }

    [Authorize(Roles = "Admin")]
    [HttpPost]
    public async Task<IActionResult> CreateContainer([FromBody] CreateContainerRequest req) =>
        Ok(await svc.CreateContainerAsync(req));

    [Authorize(Roles = "Admin")]
    [HttpPut("{id:guid}")]
    public async Task<IActionResult> UpdateContainer(Guid id, [FromBody] UpdateContainerRequest req) =>
        Ok(await svc.UpdateContainerAsync(id, req));

    [Authorize(Roles = "Admin")]
    [HttpDelete("{id:guid}")]
    public async Task<IActionResult> DeleteContainer(Guid id)
    {
        await svc.DeleteContainerAsync(id);
        return NoContent();
    }

    // ── Ranking: set manual sort weight (feature / pin) ─────────────────────────
    [Authorize(Roles = "Admin")]
    [HttpPatch("{id:guid}/sort")]
    public async Task<IActionResult> SetSort(Guid id, [FromBody] SetSortRequest req)
    {
        await svc.SetContainerSortAsync(id, req.Sort);
        return Ok(new { ok = true });
    }
}

public record SetSortRequest(int Sort);

[ApiController]
[Route("v1/projects")]
public class ProjectsController(TemplateService svc) : ControllerBase
{
    [HttpGet("{id:guid}")]
    public async Task<IActionResult> GetProject(Guid id) =>
        Ok(await svc.GetProjectDetailAsync(id));

    [Authorize(Roles = "Admin")]
    [HttpPost]
    public async Task<IActionResult> CreateProject([FromBody] CreateProjectRequest req) =>
        Ok(await svc.CreateProjectAsync(req));

    [Authorize(Roles = "Admin")]
    [HttpPut("{id:guid}")]
    public async Task<IActionResult> UpdateProject(Guid id, [FromBody] UpdateProjectRequest req) =>
        Ok(await svc.UpdateProjectAsync(id, req));

    // Partial update (aspect / resolution / dimensions / duration) without wiping other fields.
    [Authorize(Roles = "Admin")]
    [HttpPatch("{id:guid}")]
    public async Task<IActionResult> PatchProject(Guid id, [FromBody] PatchProjectRequest req) =>
        Ok(await svc.PatchProjectAsync(id, req));

    [Authorize(Roles = "Admin")]
    [HttpDelete("{id:guid}")]
    public async Task<IActionResult> DeleteProject(Guid id)
    {
        await svc.DeleteProjectAsync(id);
        return NoContent();
    }
}
