using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using GxPress.Auth;
using GxPress.Entity.WorkCar;
using GxPress.Repository.Interface.WorkCar;
using GxPress.Request.App.WorkCar;
using GxPress.Result;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace GxPress.Api.AppControllers
{
    /// <summary>
    /// 车辆
    /// </summary>
    [Route("api/app/car")]
    [ApiController]
    [Authorize]
    public class AppCarController : ControllerBase
    {
        private readonly ILoginContext _loginContext;
        private readonly ICarTypeRepository _carTypeRepository;
        private readonly ICarOrderRepository _carOrderRepository;
        private readonly ICarRepository _carRepository;

        public AppCarController(ILoginContext loginContext, ICarTypeRepository carTypeRepository, ICarOrderRepository carOrderRepository, ICarRepository carRepository)
        {
            _loginContext = loginContext;
            _carTypeRepository = carTypeRepository;
            _carOrderRepository = carOrderRepository;
            _carRepository = carRepository;
        }

        /// <summary>
        /// 获取车辆类型列表
        /// </summary>
        /// <returns></returns>
        [HttpGet("type")]
        public async Task<IEnumerable<CarType>> TypeList()
        {
            return await _carTypeRepository.GetListAsync();
        }

        /// <summary>
        /// 预定车辆
        /// </summary>
        /// <returns></returns>
        [HttpPost("actions/order")]
        public async Task<DefaultResult> Order([FromBody] CarRequest request)
        {
            var orderedCarIds =
                await _carOrderRepository.GetOrderedCarIds(request.TypeId, request.StartDate, request.EndDate);
            var carId = await _carRepository.GetAvailableCarId(request.TypeId, orderedCarIds);
            if (carId == 0)
            {
                throw new Exception("本时段车辆已预订，请更换预订时间或车辆类型");
            }

            var order = new CarOrder
            {
               UserId = _loginContext.AccountId,
               CarId = carId,
               Reasons = request.Reasons,
               Destination = request.Destination,
               TypeId = request.TypeId,
               StartDate = request.StartDate,
               EndDate = request.EndDate,
               Hour = request.Hour
            };

            await _carOrderRepository.InsertAsync(order);

            return new DefaultResult
            {
                Value = true
            };
        }
    }
}