
using DbFirst.Application.Catalogs.Commands;
using DbFirst.Application.Catalogs.Queries;
using DbFirst.Contracts.Catalogs;
using MediatR;
using Microsoft.AspNetCore.Mvc;

namespace DbFirst.API.Controllers;

[ApiController]
[Route("api/[controller]")]
public class CatalogsController : ControllerBase
{
    private readonly IMediator _mediator;

    public CatalogsController(IMediator mediator)
    {
        _mediator = mediator;
    }

    [HttpGet]
    public async Task<ActionResult<IEnumerable<CatalogReadDto>>> GetAll(CancellationToken cancellationToken)
    {
        var result = await _mediator.Send(new GetAllCatalogsQuery(), cancellationToken);
        return Ok(result);
    }

    [HttpGet("{id:int}")]
    public async Task<ActionResult<CatalogReadDto>> GetById(int id, CancellationToken cancellationToken)
    {
        var result = await _mediator.Send(new GetCatalogByIdQuery(id), cancellationToken);
        if (result == null)
        {
            return NotFound();
        }
        return Ok(result);
    }

    [HttpPost]
    public async Task<ActionResult<CatalogReadDto>> Create([FromBody]CatalogWriteDto dto, CancellationToken cancellationToken)
    {
        var created = await _mediator.Send(new CreateCatalogCommand(dto), cancellationToken);
        if (created == null)
        {
            return Conflict();
        }
        return CreatedAtAction(nameof(GetById), new { id = created.Guid }, created);
    }

    [HttpPut("{id:int}")]
    public async Task<ActionResult<CatalogReadDto>> Update(int id, [FromBody] CatalogWriteDto dto, CancellationToken cancellationToken)
    {
        var updated = await _mediator.Send(new UpdateCatalogCommand(id, dto), cancellationToken);
        if (updated == null)
        {
            return NotFound();
        }
        return Ok(updated);
    }

    [HttpDelete("{id:int}")]
    public async Task<IActionResult> Delete(int id, CancellationToken cancellationToken)
    {
        var deleted = await _mediator.Send(new DeleteCatalogCommand(id), cancellationToken);
        if (!deleted)
        {
            return NotFound();
        }
        return NoContent();
    }
}
