using Lada.Framework.Data.Enums;
using Lada.Framework.DTO.SmartTable;
using Ladaer.BackEnd.Infrastructures.DTO.Models.ErrorReports;
using Ladaer.BackEnd.Infrastructures.Services.ErrorReports;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Ladaer.BackEnd.Controllers.Systems
{
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class ErrorReportController : ControllerBase
    {
        private readonly IErrorReportService _errorReportService;

        public ErrorReportController(IErrorReportService errorReportService)
        {
            _errorReportService = errorReportService;
        }

        /// <summary>
        /// Tạo mới báo lỗi (không cần đăng nhập)
        /// </summary>
        /// <param name="model">Thông tin báo lỗi</param>
        /// <returns>Kết quả tạo báo lỗi</returns>
        [HttpPost("Create")]
        [AllowAnonymous]
        public async Task<IActionResult> Create([FromForm] ErrorReportModel model)
        {
            if (!ModelState.IsValid)
            {
                var errors = ModelState.Values
                    .SelectMany(v => v.Errors)
                    .Select(e => e.ErrorMessage)
                    .ToList();

                return BadRequest(new
                {
                    success = false,
                    message = "Dữ liệu không hợp lệ",
                    errors = errors
                });
            }

            var result = await _errorReportService.Create(model);
            return Ok(result);
        }

        /// <summary>
        /// Tìm kiếm báo lỗi (dành cho admin)
        /// </summary>
        /// <param name="param">Tham số tìm kiếm</param>
        /// <returns>Danh sách báo lỗi</returns>
        [HttpPost("Search")]
        [Authorize(Roles = "Founder,Co-Founder,Admin,IT")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            var result = await _errorReportService.Search(param);
            return Ok(result);
        }

        /// <summary>
        /// Lấy chi tiết báo lỗi (dành cho admin)
        /// </summary>
        /// <param name="id">ID báo lỗi</param>
        /// <returns>Chi tiết báo lỗi</returns>
        [HttpGet("GetById/{id}")]
        [Authorize(Roles = "Founder,Co-Founder,Admin,IT")]
        public async Task<IActionResult> GetById(int id)
        {
            var result = await _errorReportService.GetById(id);
            return Ok(result);
        }

        /// <summary>
        /// Cập nhật trạng thái báo lỗi (dành cho admin)
        /// </summary>
        /// <param name="model">Thông tin cập nhật</param>
        /// <returns>Kết quả cập nhật</returns>
        [HttpPost("UpdateStatus")]
        [Authorize(Roles = "Founder,Co-Founder,Admin,IT")]
        public async Task<IActionResult> UpdateStatus([FromBody] ErrorReportUpdateModel model)
        {
            if (!ModelState.IsValid)
            {
                var errors = ModelState.Values
                    .SelectMany(v => v.Errors)
                    .Select(e => e.ErrorMessage)
                    .ToList();

                return BadRequest(new
                {
                    success = false,
                    message = "Dữ liệu không hợp lệ",
                    errors = errors
                });
            }

            var result = await _errorReportService.UpdateStatus(model);
            return Ok(result);
        }

        /// <summary>
        /// Xóa báo lỗi (dành cho admin)
        /// </summary>
        /// <param name="id">ID báo lỗi</param>
        /// <returns>Kết quả xóa</returns>
        [HttpDelete("Delete/{id}")]
        [Authorize(Roles = "Founder,Co-Founder,Admin")]
        public async Task<IActionResult> Delete(int id)
        {
            var result = await _errorReportService.Delete(id);
            return Ok(result);
        }

        /// <summary>
        /// Lấy danh sách báo lỗi theo trạng thái (dành cho admin)
        /// </summary>
        /// <param name="status">Trạng thái</param>
        /// <param name="pageIndex">Trang hiện tại</param>
        /// <param name="pageSize">Kích thước trang</param>
        /// <returns>Danh sách báo lỗi</returns>
        [HttpGet("GetByStatus")]
        [Authorize(Roles = "Founder,Co-Founder,Admin,IT")]
        public async Task<IActionResult> GetByStatus(
            [FromQuery] ErrorReportStatus status,
            [FromQuery] int pageIndex = 1,
            [FromQuery] int pageSize = 20)
        {
            var result = await _errorReportService.GetByStatus(status, pageIndex, pageSize);
            return Ok(result);
        }

        /// <summary>
        /// Lấy danh sách báo lỗi mới (dành cho admin)
        /// </summary>
        /// <param name="pageIndex">Trang hiện tại</param>
        /// <param name="pageSize">Kích thước trang</param>
        /// <returns>Danh sách báo lỗi mới</returns>
        [HttpGet("GetNewReports")]
        [Authorize(Roles = "Founder,Co-Founder,Admin,IT")]
        public async Task<IActionResult> GetNewReports(
            [FromQuery] int pageIndex = 1,
            [FromQuery] int pageSize = 20)
        {
            var result = await _errorReportService.GetByStatus(ErrorReportStatus.New, pageIndex, pageSize);
            return Ok(result);
        }

        /// <summary>
        /// Lấy danh sách báo lỗi đang xử lý (dành cho admin)
        /// </summary>
        /// <param name="pageIndex">Trang hiện tại</param>
        /// <param name="pageSize">Kích thước trang</param>
        /// <returns>Danh sách báo lỗi đang xử lý</returns>
        [HttpGet("GetInProgressReports")]
        [Authorize(Roles = "Founder,Co-Founder,Admin,IT")]
        public async Task<IActionResult> GetInProgressReports(
            [FromQuery] int pageIndex = 1,
            [FromQuery] int pageSize = 20)
        {
            var result = await _errorReportService.GetByStatus(ErrorReportStatus.InProgress, pageIndex, pageSize);
            return Ok(result);
        }

        /// <summary>
        /// Đánh dấu báo lỗi là đang xử lý
        /// </summary>
        /// <param name="id">ID báo lỗi</param>
        /// <returns>Kết quả cập nhật</returns>
        [HttpPost("MarkAsInProgress/{id}")]
        [Authorize(Roles = "Founder,Co-Founder,Admin,IT")]
        public async Task<IActionResult> MarkAsInProgress(int id)
        {
            var model = new ErrorReportUpdateModel
            {
                Id = id,
                Status = ErrorReportStatus.InProgress,
                AdminNote = "Đã tiếp nhận và đang xử lý"
            };

            var result = await _errorReportService.UpdateStatus(model);
            return Ok(result);
        }

        /// <summary>
        /// Đánh dấu báo lỗi là đã xử lý
        /// </summary>
        /// <param name="id">ID báo lỗi</param>
        /// <param name="adminNote">Ghi chú từ admin</param>
        /// <returns>Kết quả cập nhật</returns>
        [HttpPost("MarkAsResolved/{id}")]
        [Authorize(Roles = "Founder,Co-Founder,Admin,IT")]
        public async Task<IActionResult> MarkAsResolved(int id, [FromBody] string adminNote = "")
        {
            var model = new ErrorReportUpdateModel
            {
                Id = id,
                Status = ErrorReportStatus.Resolved,
                AdminNote = string.IsNullOrEmpty(adminNote) ? "Đã xử lý xong" : adminNote
            };

            var result = await _errorReportService.UpdateStatus(model);
            return Ok(result);
        }

        /// <summary>
        /// Đóng báo lỗi
        /// </summary>
        /// <param name="id">ID báo lỗi</param>
        /// <param name="adminNote">Ghi chú từ admin</param>
        /// <returns>Kết quả cập nhật</returns>
        [HttpPost("Close/{id}")]
        [Authorize(Roles = "Founder,Co-Founder,Admin,IT")]
        public async Task<IActionResult> Close(int id, [FromBody] string adminNote = "")
        {
            var model = new ErrorReportUpdateModel
            {
                Id = id,
                Status = ErrorReportStatus.Closed,
                AdminNote = string.IsNullOrEmpty(adminNote) ? "Đã đóng" : adminNote
            };

            var result = await _errorReportService.UpdateStatus(model);
            return Ok(result);
        }
    }
}
