using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Transactions;
using UnivateProperties_API.Containers.Timeshare;
using UnivateProperties_API.Model.Timeshare;
using UnivateProperties_API.Repository;
using UnivateProperties_API.Repository.Timeshare;

namespace UnivateProperties_API.Controllers.Timeshare
{
    [Route("api/[controller]")]
    [ApiController]
    public class TimeshareWeekController : ControllerBase
    {
        private readonly IRepository<TimeshareWeek> _Repo;

        public TimeshareWeekController(IRepository<TimeshareWeek> repo)
        {
            _Repo = repo;
        }

        [HttpGet]
        public IActionResult Get()
        {
            var items = _Repo.GetAll();
            return new OkObjectResult(items);
        }

        [HttpGet("{id}")]
        public IActionResult Get(int id)
        {
            var item = _Repo.Get(x => x.Id == id);
            return new OkObjectResult(item);
        }

        [HttpGet("getBy")]
        public IActionResult GetBy(WeekFilterDto week)
        {
            var item = (_Repo as WeekRepository).GetBy(week);
            return new OkObjectResult(item);
        }
        
        [HttpPost]
        public IActionResult Post([FromBody] TimeshareWeek item)
        {
            using (var scope = new TransactionScope())
            {
                _Repo.Insert(item);
                scope.Complete();
                return CreatedAtAction(nameof(Get), new { id = item.Id }, item);
            }
        }

        [HttpPut("{id}")]
        public IActionResult Put([FromBody] TimeshareWeek item)
        {
            if (item != null)
            {
                using (var scope = new TransactionScope())
                {
                    _Repo.Update(item);
                    scope.Complete();
                    return new OkResult();
                }
            }
            return new NoContentResult();
        }

        [HttpDelete("{id}")]
        public IActionResult Delete(int id)
        {
            _Repo.RemoveAtId(id);
            return new OkResult();
        }
    }
}