package com.ga.api.controller.report;

import com.ga.api.service.report.ReportService;
import com.ga.common.annotation.RequirePermission;
import com.ga.common.excel.ExcelService;
import com.ga.common.model.ApiResponse;
import com.ga.core.vo.report.ChargebackRiskRow;
import com.ga.core.vo.report.OrgReportRow;
import com.ga.core.vo.report.PerfReportRow;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;

/**
 * 리포트 — 실적 / 조직별 / 환수위험. 읽기전용 집계 (신규 테이블 없음).
 * 각 화면의 조회 + 엑셀 export 엔드포인트 제공.
 */
@Tag(name = "리포트")
@RestController
@RequestMapping("/api/report")
@RequiredArgsConstructor
public class ReportController {

    private final ReportService service;
    private final ExcelService excelService;

    private String defaultYear(String year) {
        return (year != null && !year.isBlank()) ? year : String.valueOf(LocalDate.now().getYear());
    }

    private String defaultMonth(String settleMonth) {
        return (settleMonth != null && !settleMonth.isBlank())
                ? settleMonth : LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMM"));
    }

    // ── 실적 리포트 ──
    @GetMapping("/performance")
    @RequirePermission(menu = "REPORT_PERFORMANCE", perm = "READ")
    public ApiResponse<List<PerfReportRow>> performance(@RequestParam(required = false) String year) {
        return ApiResponse.ok(service.performance(defaultYear(year)));
    }

    @GetMapping("/performance/export")
    @RequirePermission(menu = "REPORT_PERFORMANCE", perm = "READ")
    public void performanceExport(@RequestParam(required = false) String year, HttpServletResponse response) {
        String y = defaultYear(year);
        excelService.exportLargeExcel("실적리포트", PerfReportRow.class,
                () -> service.performanceCursor(y), response);
    }

    // ── 조직별 리포트 ──
    @GetMapping("/org")
    @RequirePermission(menu = "REPORT_ORG", perm = "READ")
    public ApiResponse<List<OrgReportRow>> org(@RequestParam(required = false) String settleMonth) {
        return ApiResponse.ok(service.org(defaultMonth(settleMonth)));
    }

    @GetMapping("/org/export")
    @RequirePermission(menu = "REPORT_ORG", perm = "READ")
    public void orgExport(@RequestParam(required = false) String settleMonth, HttpServletResponse response) {
        String m = defaultMonth(settleMonth);
        excelService.exportLargeExcel("조직별리포트", OrgReportRow.class,
                () -> service.orgCursor(m), response);
    }

    // ── 환수위험 리포트 ──
    @GetMapping("/chargeback-risk")
    @RequirePermission(menu = "REPORT_CHARGEBACK", perm = "READ")
    public ApiResponse<List<ChargebackRiskRow>> chargebackRisk() {
        return ApiResponse.ok(service.chargebackRisk());
    }

    @GetMapping("/chargeback-risk/export")
    @RequirePermission(menu = "REPORT_CHARGEBACK", perm = "READ")
    public void chargebackRiskExport(HttpServletResponse response) {
        excelService.exportLargeExcel("환수위험리포트", ChargebackRiskRow.class,
                () -> service.chargebackRiskCursor(), response);
    }
}
