using Application.Abstractions.Interfaces; using Application.DTOs.AdminDTOs; using Application.DTOs.UserDTOs; using Application.DTOs.OrderDTOs; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace RobDeliveryAPI.Controllers { [ApiController] [Route("api/[controller]")] [Authorize(Roles = "Admin")] public class AdminController : ControllerBase { private readonly IAdminService _adminService; private readonly ISettingsService _settingsService; private readonly IUserService _userService; private readonly IOrderService _orderService; public AdminController( IAdminService adminService, ISettingsService settingsService, IUserService userService, IOrderService orderService) { _adminService = adminService; _settingsService = settingsService; _userService = userService; _orderService = orderService; } /// /// Get system statistics for dashboard /// [HttpGet("stats")] public async Task GetSystemStats() { try { var stats = await _adminService.GetSystemStatsAsync(); return Ok(stats); } catch (Exception ex) { return StatusCode(500, new { error = "Failed to retrieve system stats", details = ex.Message }); } } /// /// Export delivery history as JSON /// [HttpGet("export/delivery-history")] public async Task ExportDeliveryHistory() { try { var historyJson = await _adminService.ExportDeliveryHistoryAsync(); var fileName = $"DeliveryHistory_{DateTime.Now:yyyyMMdd_HHmmss}.json"; return File( System.Text.Encoding.UTF8.GetBytes(historyJson), "application/json", fileName ); } catch (Exception ex) { return StatusCode(500, new { error = "Failed to export delivery history", details = ex.Message }); } } /// /// Create database backup /// [HttpPost("backup")] public async Task CreateBackup([FromBody] BackupRequestDTO request) { try { string backupPath = request.BackupPath ?? "Backups"; var success = await _adminService.CreateDatabaseBackupAsync(backupPath); if (success) { return Ok(new { message = "Backup created successfully", path = backupPath }); } else { return StatusCode(500, new { error = "Failed to create backup" }); } } catch (Exception ex) { return StatusCode(500, new { error = "Failed to create backup", details = ex.Message }); } } /// /// Get robot efficiency analytics /// [HttpGet("analytics/robot-efficiency")] public async Task GetRobotEfficiency() { try { var efficiency = await _adminService.GetRobotEfficiencyAsync(); return Ok(efficiency); } catch (Exception ex) { return StatusCode(500, new { error = "Failed to retrieve robot efficiency", details = ex.Message }); } } /// /// Generate a new admin registration key /// [HttpPost("keys/generate")] public async Task GenerateAdminKey([FromBody] CreateAdminKeyDTO request) { try { var userIdClaim = User.FindFirst("Id")?.Value; if (userIdClaim == null || !int.TryParse(userIdClaim, out int adminId)) { return Unauthorized(new { error = "Invalid token" }); } var adminKey = await _adminService.GenerateAdminKeyAsync( adminId, request.ExpiresAt, request.Description ); return Ok(new { message = "Admin key generated successfully", key = adminKey }); } catch (Exception ex) { return StatusCode(500, new { error = "Failed to generate admin key", details = ex.Message }); } } /// /// Get all admin keys /// [HttpGet("keys")] public async Task GetAllAdminKeys() { try { var keys = await _adminService.GetAllAdminKeysAsync(); return Ok(keys); } catch (Exception ex) { return StatusCode(500, new { error = "Failed to retrieve admin keys", details = ex.Message }); } } /// /// Get unused admin keys /// [HttpGet("keys/unused")] public async Task GetUnusedAdminKeys() { try { var keys = await _adminService.GetUnusedAdminKeysAsync(); return Ok(keys); } catch (Exception ex) { return StatusCode(500, new { error = "Failed to retrieve unused admin keys", details = ex.Message }); } } /// /// Revoke an admin key /// [HttpPost("keys/{keyId}/revoke")] public async Task RevokeAdminKey(int keyId) { try { var success = await _adminService.RevokeAdminKeyAsync(keyId); if (success) { return Ok(new { message = "Admin key revoked successfully" }); } else { return NotFound(new { error = "Admin key not found or already used" }); } } catch (Exception ex) { return StatusCode(500, new { error = "Failed to revoke admin key", details = ex.Message }); } } /// /// Get current delivery pricing settings /// [HttpGet("pricing")] public async Task GetPricingSettings() { try { var settings = await _settingsService.GetPricingSettingsAsync(); return Ok(settings); } catch (Exception ex) { return StatusCode(500, new { error = "Failed to retrieve pricing settings", details = ex.Message }); } } /// /// Update delivery pricing settings /// [HttpPut("pricing")] public async Task UpdatePricingSettings([FromBody] UpdatePricingDTO request) { try { var success = await _settingsService.UpdatePricingSettingsAsync(request); if (success) { return Ok(new { message = "Pricing settings updated successfully" }); } return BadRequest(new { error = "Failed to update pricing settings" }); } catch (Exception ex) { return StatusCode(500, new { error = "Failed to update pricing settings", details = ex.Message }); } } /// /// Download database backup file /// [HttpGet("backup/download")] public async Task DownloadBackup() { try { var (content, contentType, fileName) = await _adminService.DownloadDatabaseAsync(); return File(content, contentType, fileName); } catch (Exception ex) { return StatusCode(500, new { error = "Failed to download backup", details = ex.Message }); } } /// /// Restore database from uploaded file /// [HttpPost("backup/restore")] [Consumes("multipart/form-data")] public async Task RestoreBackup(IFormFile file) { if (file == null || file.Length == 0) { return BadRequest(new { error = "No file uploaded" }); } try { using (var stream = file.OpenReadStream()) { var success = await _adminService.RestoreDatabaseAsync(stream); if (success) { return Ok(new { message = "Database restored successfully. Application may need to restart to apply changes completely." }); } } return StatusCode(500, new { error = "Failed to restore database" }); } catch (Exception ex) { return StatusCode(500, new { error = "Failed to restore database", details = ex.Message }); } } // --- USER MANAGEMENT --- [HttpGet("users")] public async Task GetAllUsers() { var users = await _userService.GetAllUsersAsync(); return Ok(users); } [HttpPut("users")] public async Task UpdateUser([FromBody] AdminUpdateUserDTO updateDto) { var success = await _userService.AdminUpdateUserAsync(updateDto); return success ? Ok(new { message = "User updated successfully" }) : NotFound(new { error = "User not found" }); } [HttpDelete("users/{userId}")] public async Task DeleteUser(int userId) { var success = await _userService.DeleteUserAsync(userId); return success ? Ok(new { message = "User deleted successfully" }) : NotFound(new { error = "User not found" }); } // --- ORDER MANAGEMENT --- [HttpGet("orders")] public async Task GetAllOrders() { var orders = await _orderService.GetAllOrdersAsync(); return Ok(orders); } [HttpPut("orders")] public async Task UpdateOrder([FromBody] AdminUpdateOrderDTO updateDto) { var success = await _orderService.AdminUpdateOrderAsync(updateDto); return success ? Ok(new { message = "Order updated successfully" }) : NotFound(new { error = "Order not found" }); } [HttpDelete("orders/{orderId}")] public async Task DeleteOrder(int orderId) { var success = await _orderService.DeleteOrderAsync(orderId); return success ? Ok(new { message = "Order deleted successfully" }) : NotFound(new { error = "Order not found" }); } // --- KEY MANAGEMENT (EXPANDED) --- [HttpPut("keys")] public async Task UpdateAdminKey([FromBody] AdminUpdateKeyDTO updateDto) { var success = await _adminService.UpdateAdminKeyAsync(updateDto); return success ? Ok(new { message = "Admin key updated successfully" }) : NotFound(new { error = "Admin key not found" }); } [HttpDelete("keys/{keyId}")] public async Task DeleteAdminKey(int keyId) { var success = await _adminService.DeleteAdminKeyAsync(keyId); return success ? Ok(new { message = "Admin key deleted successfully" }) : NotFound(new { error = "Admin key not found" }); } } public class BackupRequestDTO { public string? BackupPath { get; set; } } }