using Contracts;
using Microsoft.AspNetCore.Mvc;
using Services.Abstractions;

namespace Web.Controllers
{
    [ApiController]
    [Route("api/streets")]
    public class StreetController : ControllerBase
    {
        private readonly IStreetService _streetService;
        public StreetController(IStreetService streetService)
        {
            _streetService = streetService;
        }
        [HttpGet]
        public async Task<IActionResult> GetAllAsync()
        {
            var steets = await _streetService.GetAllAsync();
            return Ok(steets);
        }
        [HttpGet("{id:guid}")]
        public async Task<IActionResult> GetByIdAsync(Guid id)
        {
            var street = await _streetService.GetByIdAsync(id);
            if (street == null)
            {
                return NotFound("Город не найден.");
            }
            return Ok(street);
        }
        [HttpPost]
        public async Task<IActionResult> CreateAsync([FromBody] StreetDtoForCreate streetDto)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            var newStreet = await _streetService.CreateAsync(streetDto);
            return Ok(newStreet);
        }
        [HttpPut("{id:guid}")]
        public async Task<IActionResult> UpdateAsync(Guid id, [FromBody] StreetDtoForUpdate streetDto)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            try
            {
                await _streetService.UpdateAsync(id, streetDto);
            }
            catch (KeyNotFoundException)
            {
                return NotFound("Город не найден.");
            }

            return NoContent();
        }
        [HttpDelete("{id:guid}")]
        public async Task<IActionResult> DeleteAsync(Guid id)
        {
            try
            {
                await _streetService.DeleteAsync(id);
            }
            catch (KeyNotFoundException)
            {
                return NotFound("Город не найден.");
            }

            return NoContent();
        }


        [HttpGet("search")]
        public async Task<IActionResult> SearchStreet([FromQuery] string query)
        {
            var streets = await _streetService.SearchAsync(query);
            return Ok(streets);
        }
    }
}