package com.saas.admin.controller;

import com.saas.admin.service.TenantService;
import com.saas.shared.dto.common.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/api/admin/stats")
@RequiredArgsConstructor
@Slf4j
@Tag(name = "Admin - Statistics", description = "Operations for dashboard statistics")
@PreAuthorize("hasRole('SYSTEM_ADMIN')")
public class AdminStatsController {

    private final com.saas.admin.repository.TenantRepository tenantRepository;
    private final com.saas.admin.repository.TenantAIConfigRepository aiConfigRepository;
    private final com.saas.tenant.repository.InboundCallDataRepository inboundCallDataRepository;

    @GetMapping
    @Operation(summary = "Get system statistics", description = "Retrieve aggregated system statistics")
    public ResponseEntity<ApiResponse<Map<String, Object>>> getSystemStats() {
        log.info("Request to get system stats");

        Map<String, Object> stats = new HashMap<>();

        // 1. Tenant Stats
        long totalTenants = tenantRepository.count();
        stats.put("totalTenants", totalTenants);
        stats.put("newTenantsThisMonth", 0); // TODO: Implement created_at query

        // 2. AI Assistant Stats
        stats.put("activeAssistants", aiConfigRepository.countByEnabledTrue());
        stats.put("vapiAssistants", aiConfigRepository.countByPrimaryProvider(com.saas.shared.enums.AIProvider.VAPI));
        stats.put("retellAssistants",
                aiConfigRepository.countByPrimaryProvider(com.saas.shared.enums.AIProvider.RETELL));

        // 3. Call Stats (Global from Admin DB)
        try {
            com.saas.shared.core.TenantContext.setTenantId("saas_db");
            long totalCalls = inboundCallDataRepository.count();
            long callsToday = inboundCallDataRepository
                    .countByStartTimeAfter(java.time.LocalDateTime.now().with(java.time.LocalTime.MIN));

            stats.put("totalCalls", totalCalls);
            stats.put("callsToday", callsToday);
        } catch (Exception e) {
            log.error("Error fetching call stats", e);
            stats.put("totalCalls", 0);
            stats.put("callsToday", 0);
        } finally {
            com.saas.shared.core.TenantContext.clear();
        }

        // 4. Revenue (Mocked for now)
        stats.put("monthlyRevenue", 4250.00);
        stats.put("revenueGrowth", 12.5);

        return ResponseEntity.ok(ApiResponse.success(stats, "System stats retrieved successfully"));
    }

    @GetMapping("/activity")
    @Operation(summary = "Get recent activity", description = "Retrieve recent system activity logs")
    public ResponseEntity<ApiResponse<Object>> getActivityLogs(@RequestParam(defaultValue = "10") int limit) {
        // Placeholder for AuditService integration
        return ResponseEntity.ok(ApiResponse.success(new Object[] {}, "Activity logs retrieved successfully"));
    }

    @GetMapping("/revenue")
    @Operation(summary = "Get revenue analytics", description = "Retrieve revenue analytics data")
    public ResponseEntity<ApiResponse<Object>> getRevenueAnalytics(
            @RequestParam(defaultValue = "month") String period) {
        // Placeholder for RevenueService integration
        return ResponseEntity.ok(ApiResponse.success(new Object[] {}, "Revenue analytics retrieved successfully"));
    }
}
