using System.Text;
using Infrastructure;
using Infrastructure.CloudSdk.wayline;
using Infrastructure.Extensions;
using Infrastructure.Helpers;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using OpenAuth.App.ServiceApp;
using OpenAuth.App.ServiceApp.Request;
using OpenAuth.App.ServiceApp.Response;
using OpenAuth.Repository.Domain;

namespace OpenAuth.WebApi.Controllers.ServiceControllers
{
    /// <summary>
    /// 后台管理模块
    /// </summary>
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class ManageController : ControllerBase
    {
        private readonly ManageApp _app;
        private readonly MqttClientManager _mqttClientManager;

        public ManageController(ManageApp app, MqttClientManager mqttClientManager)
        {
            _app = app;
            _mqttClientManager = mqttClientManager;
        }

        #region 机场管理

        /// <summary>
        /// 获取机场列表
        /// </summary>
        /// <param name="page"></param>
        /// <param name="limit"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<Response<PageInfo<List<LasaDronePort>>>> GetDataList(int page, int limit, string key)
        {
            var result = new Response<PageInfo<List<LasaDronePort>>>();
            try
            {
                result = await _app.GetPageList(page, limit, key);
            }
            catch (Exception ex)
            {
                result.Code = 500;
                result.Message = ex.Message;
            }

            return result;
        }

        /// <summary>
        /// 编辑机场
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<bool>> EditDronePort(LasaDronePort info)
        {
            return await _app.EditDronePort(info);
        }

        /// <summary>
        /// 修改机场固件信息
        /// </summary>
        /// <param name="id">机场id</param>
        /// <param name="firmwareVersion">机场版本</param>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<bool>> EditDronePortFirmware(string id, string firmwareVersion)
        {
            return await _app.EditDronePortFirmware(id, firmwareVersion);
        }

        /// <summary>
        /// 删除机场
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<bool>> DeleteDronePort(string id)
        {
            return await _app.DeleteDronePort(id);
        }

        #endregion

        #region 无人机管理

        /// <summary>
        /// 获取无人机列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<Response<PageInfo<List<dynamic>>>> GetUavPageList(int page, int limit, string key)
        {
            var result = new Response<PageInfo<List<dynamic>>>();
            try
            {
                result = await _app.GetUavPageList(page, limit, key);
            }
            catch (Exception ex)
            {
                result.Code = 500;
                result.Message = ex.Message;
            }

            return result;
        }

        /// <summary>
        /// 编辑无人机
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<bool>> EditUav(LasaUav info)
        {
            return await _app.EditUav(info);
        }

        /// <summary>
        /// 修改无人机固件信息
        /// </summary>
        /// <param name="id">无人机id</param>
        /// <param name="firmwareVersion">机场版本</param>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<bool>> EditUavFirmware(string id, string firmwareVersion)
        {
            return await _app.EditUavFirmware(id, firmwareVersion);
        }

        /// <summary>
        /// 删除无人机
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<bool>> DeleteUav(string id)
        {
            return await _app.DeleteUav(id);
        }

        #endregion

        #region 任务管理

        /// <summary>
        /// 获取任务列表
        /// </summary>
        /// <param name="page"></param>
        /// <param name="limit"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<Response<PageInfo<List<LasaTask>>>> GetTaskPageList(int page, int limit, string key)
        {
            var result = new Response<PageInfo<List<LasaTask>>>();
            try
            {
                result = await _app.GetTaskPageList(page, limit, key);
            }
            catch (Exception ex)
            {
                result.Code = 500;
                result.Message = ex.Message;
            }

            return result;
        }

        /// <summary>
        /// 添加任务
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<bool>> AddTask(LasaTask info)
        {
            return await _app.AddTask(info);
        }

        /// <summary>
        /// 编辑任务
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<bool>> EditTask(LasaTask info)
        {
            return await _app.EditTask(info);
        }

        /// <summary>
        /// 删除任务
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<bool>> DeleteTask(string id)
        {
            return await _app.DeleteTask(id);
        }

        #endregion

        #region 航线管理

        /// <summary>
        /// 获取航线列表
        /// </summary>
        /// <param name="page"></param>
        /// <param name="limit"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<Response<PageInfo<List<LasaAirLine>>>> GetAirLineList(int page, int limit, string key)
        {
            var result = new Response<PageInfo<List<LasaAirLine>>>();
            try
            {
                result = await _app.GetAirLinePageList(page, limit, key);
            }
            catch (Exception ex)
            {
                result.Code = 500;
                result.Message = ex.Message;
            }

            return result;
        }

        /// <summary>
        /// 添加航线
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<bool>> AddAirLine(LasaAirLine info)
        {
            return await _app.AddAirLine(info);
        }

        /// <summary>
        /// 编辑航线
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<bool>> EditAirLine(LasaAirLine info)
        {
            return await _app.EditAirLine(info);
        }

        /// <summary>
        /// 删除航线
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<bool>> DeleteAirLine(string id)
        {
            return await _app.DeleteAirLine(id);
        }

        // todo 已有的文件如何处理？
        /// <summary>
        /// 上传航线文件
        /// </summary>
        /// <param name="xmlFile"></param>
        /// <returns></returns>
        [HttpPost("upload")]
        [AllowAnonymous]
        public async Task<IActionResult> UploadXmlFile(IFormFile xmlFile)
        {
            if (xmlFile == null || xmlFile.Length == 0)
                return BadRequest("文件为空");
            var path = await _app.UploadFile(xmlFile);
            return Ok(new { message = "上传成功", path });
        }
        /*/// <summary>
        /// 更新航线文件
        /// </summary>
        /// <param name="xmlFile"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpPost("uploadwpmlfile")]
        [AllowAnonymous]
        public async Task<IActionResult> UploadWpmlFile(IFormFile xmlFile, string id)
        {
            if (xmlFile == null || xmlFile.Length == 0)
                return BadRequest("文件为空");
            string baseFolder = "Waylines/" + (string.IsNullOrEmpty(id) ? Guid.NewGuid().ToString() : id);
            var uploadsFolder = Path.Combine(Directory.GetCurrentDirectory(), baseFolder);
            if (!Directory.Exists(uploadsFolder))
                Directory.CreateDirectory(uploadsFolder);

            // todo 这里只有一个文件，是否得改
            var filePath = Path.Combine(uploadsFolder, "waylines.wpml");

            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                await xmlFile.CopyToAsync(stream);
            }

            return Ok(new { message = "上传成功", path = filePath });
        }*/

        #endregion

        #region 项目管理

        /// <summary>
        /// 获取项目列表
        /// </summary>
        /// <param name="isjoin">是否是已加入的项目（0全部，1加入，2未加入）</param>
        /// <param name="key">项目名称筛选</param>
        /// <param name="state">状态（0全部，1进行中，2已归档）</param>
        /// <param name="order">排序</param>
        /// <returns></returns>
        [HttpGet]
        public async Task<Response<List<dynamic>>> GetWorkspaceList(int isjoin, string key, int state,
            string order = "\"CreateTime\" desc")
        {
            var result = new Response<List<dynamic>>();
            try
            {
                result = await _app.GetWorkspaceList(isjoin, key, state, order);
            }
            catch (Exception ex)
            {
                result.Code = 500;
                result.Message = ex.Message;
            }

            return result;
        }

        /// <summary>
        /// 添加项目
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<bool>> AddWorkspace(WorkSpace info)
        {
            return await _app.AddWorkspace(info);
        }

        /// <summary>
        /// 编辑项目
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<bool>> EditWorkspace(WorkSpace info)
        {
            return await _app.EditWorkspace(info);
        }

        /// <summary>
        /// 删除项目
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<bool>> DeleteWorkspace(string id)
        {
            return await _app.DeleteWorkspace(id);
        }

        /// <summary>
        /// 归档项目
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<bool>> CompleteWorkspace(string id)
        {
            return await _app.CompleteWorkspace(id);
        }

        /// <summary>
        /// 获取机场列表，添加项目使用
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<Response<List<LasaDronePort>>> GetUavList()
        {
            var result = new Response<List<LasaDronePort>>();
            try
            {
                result = await _app.GetUavList();
            }
            catch (Exception ex)
            {
                result.Code = 500;
                result.Message = ex.Message;
            }

            return result;
        }

        /// <summary>
        /// 根据项目id获取项目信息，编辑项目使用
        /// </summary>
        /// <param name="id">项目id</param>
        /// <returns></returns>
        [HttpGet]
        public async Task<Response<WorkSpaceRes>> GetWorkSpaceById(string id)
        {
            var result = new Response<WorkSpaceRes>();
            try
            {
                result = await _app.GetWorkSpaceById(id);
            }
            catch (Exception ex)
            {
                result.Code = 500;
                result.Message = ex.Message;
            }

            return result;
        }

        #endregion

        // 航线任务在云端的 共享查看、下发执行、取消以及进度上报等功能。
        /// <summary>
        /// 解除挂起（执行任务） todo 需不需要加时间限制判断？ 
        /// </summary>
        /// <param name="taskId"></param>
        [HttpPost]
        [AllowAnonymous]
        public async Task ExecuteFlyTask(string taskId)
        {
            await _app.ExecuteFlyTask(taskId);
        }

        /// <summary>
        /// 挂起任务
        /// </summary>
        /// <param name="taskId"></param>
        [HttpPost]
        public async Task PendingFlyTask(string taskId)
        {
            await _app.PendingFlyTask(taskId);
        }

        [HttpPost]
        [AllowAnonymous]
        public async Task<string> TestExecuteFlyTask(string flightid)
        {
            return await _app.TestExecuteFlyTask(flightid);
        }

        /// <summary>
        /// 测试
        /// </summary>
        [HttpGet]
        [AllowAnonymous]
        public async Task Test()
        {
            await _mqttClientManager.SubscribeAsync("thing/product/8UUXN5400A079H/osd", async (args) =>
            {
                var payload = args.ApplicationMessage.Payload;
                var message = Encoding.UTF8.GetString(payload);
                Console.WriteLine($"收到主题 [{args.ApplicationMessage.Topic}] 的消息: {message}");
                await Task.CompletedTask; // 可选：实际逻辑中可执行更多异步操作
            });
        }

        /// <summary>
        /// 测试序列化，是否符合要求 
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [AllowAnonymous]
        public string TestJsonRequest()
        {
            var request = new TopicServicesRequest<object>()
                .SetTid("tid")
                .SetBid("bid")
                .SetTimestamp(DateTime.Now.Ticks)
                .SetData(new { name = "张三" });
            return JsonConvert.SerializeObject(request);
        }

        [HttpGet]
        [AllowAnonymous]
        public string TestGetDevJson()
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile(
                    $"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Development"}.json",
                    optional: true)
                .AddEnvironmentVariables();
            // 构建配置
            var configuration = builder.Build();
            // 读取连接字符串
            var dir = configuration["WpmlDir"];
            return dir;
        }

        #region 添加地图作业区域

        /// <summary>
        /// 添加地图作业区域
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<string>> AddWorkArea([FromBody] LasaShpData model)
        {
            var res = new Response<string>();
            try
            {
                return await _app.AddWorkArea(model);
            }
            catch (Exception ex)
            {
                res.Code = 500;
                res.Message = ex.InnerException?.Message ?? ex.Message;
            }

            return res;
        }

        /// <summary>
        /// 更新地图作业区域
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<string>> UpdateWorkArea([FromBody] LasaShpData model)
        {
            var res = new Response<string>();
            try
            {
                return await _app.UpdateWorkArea(model);
            }
            catch (Exception ex)
            {
                res.Code = 500;
                res.Message = ex.InnerException?.Message ?? ex.Message;
            }

            return res;
        }

        /// <summary>
        /// 删除地图作业区域
        /// </summary>
        /// <param name="id">地图作业区域id</param>
        /// <returns></returns>
        [HttpPost]
        public async Task<Response<bool>> DeleteWorkArea(string id)
        {
            return await _app.DeleteWorkArea(id);
        }

        /// <summary>
        /// 获取地图作业区域列表
        /// </summary>
        /// <param name="workspaceid">项目id</param>
        /// <param name="state">项目状态（0已启用，1已禁用，null全部）</param>
        /// <param name="type">区域类型（作业区，限飞区等）</param>
        /// <returns></returns>
        [HttpGet]
        public async Task<Response<List<LasaShpData>>> GetWorkAreaList(string workspaceid, int? state, string type)
        {
            var result = new Response<List<LasaShpData>>();
            try
            {
                result = await _app.GetWorkAreaList(workspaceid, state, type);
            }
            catch (Exception ex)
            {
                result.Code = 500;
                result.Message = ex.Message;
            }

            return result;
        }

        #endregion
    }
}