package com.saas.admin.controller;

import com.saas.shared.datasource.DynamicHikariDataSourceManager;
import com.saas.shared.dto.common.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

/**
 * Admin Controller for Dynamic HikariCP DataSource Management
 * 
 * Provides monitoring and management endpoints for tenant connection pools
 */
@RestController
@RequestMapping("/api/admin/datasource")
@Tag(name = "Admin - DataSource Management", description = "Monitor and manage tenant connection pools")
@Slf4j
public class AdminDataSourceController {

    private final DynamicHikariDataSourceManager dataSourceManager;

    public AdminDataSourceController(DynamicHikariDataSourceManager dataSourceManager) {
        this.dataSourceManager = dataSourceManager;
    }

    /**
     * Get connection pool statistics
     * 
     * @return Pool statistics (active pools, max pools, tenant list)
     */
    @GetMapping("/stats")
    @PreAuthorize("hasRole('ADMIN')")
    @Operation(summary = "Get pool statistics", description = "Returns active connection pool statistics")
    public ResponseEntity<ApiResponse<DynamicHikariDataSourceManager.PoolStatistics>> getPoolStatistics() {
        log.info("Fetching connection pool statistics");
        
        DynamicHikariDataSourceManager.PoolStatistics stats = dataSourceManager.getStatistics();
        
        return ResponseEntity.ok(ApiResponse.success(stats, "Pool statistics retrieved successfully"));
    }

    /**
     * Manually close a tenant's connection pool
     * 
     * @param tenantId Tenant database name (e.g., tenant_acme_corp)
     * @return Success message
     */
    @DeleteMapping("/pools/{tenantId}")
    @PreAuthorize("hasRole('ADMIN')")
    @Operation(summary = "Close tenant pool", description = "Manually close a tenant's connection pool")
    public ResponseEntity<ApiResponse<String>> closePool(@PathVariable String tenantId) {
        log.info("Manually closing pool for tenant: {}", tenantId);
        
        if ("saas_db".equals(tenantId)) {
            return ResponseEntity.badRequest()
                    .body(ApiResponse.error(null, "Cannot close admin pool"));
        }
        
        dataSourceManager.closeDataSource(tenantId);
        
        return ResponseEntity.ok(ApiResponse.success(
                "Pool closed successfully for tenant: " + tenantId, 
                "Pool closed successfully"));
    }

    /**
     * Health check for DataSource Manager
     * 
     * @return Health status
     */
    @GetMapping("/health")
    @PreAuthorize("hasRole('ADMIN')")
    @Operation(summary = "DataSource health check", description = "Check DataSource manager health")
    public ResponseEntity<ApiResponse<String>> healthCheck() {
        DynamicHikariDataSourceManager.PoolStatistics stats = dataSourceManager.getStatistics();
        
        String message = String.format("DataSource Manager healthy. Active pools: %d/%d", 
                stats.getActivePools(), stats.getMaxPools());
        
        return ResponseEntity.ok(ApiResponse.success(message, "Health check passed"));
    }
}
