package incheon.ags.ias.cntn.cntnPrst.web;

import incheon.ags.ias.cntn.cntnPrst.service.CntnPrstService;
import incheon.ags.ias.cntn.cntnPrst.vo.CntnPrstVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
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 javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/cntnPrst")
public class CntnPrstApiController {

    private final CntnPrstService cntnPrstService;

    /**
     * 최근 N일간 일별 누적 접속 통계 엑셀 다운로드
     */
    @GetMapping("/excel/daily")
    public void downloadDailyStatsExcel(
            @RequestParam(defaultValue = "90") int days,
            HttpServletResponse response) {

        log.info("일별 접속 통계 엑셀 다운로드 요청 - days: {}", days);

        try {
            CntnPrstVO vo = new CntnPrstVO();
            vo.setDays(days);
            List<Map<String, Object>> data = cntnPrstService.selectCntnPrstDailyStats(vo);

            if (data == null || data.isEmpty()) {
                response.setStatus(HttpServletResponse.SC_NO_CONTENT);
                response.setContentType("application/json;charset=UTF-8");
                response.getWriter().write("{\"success\":false,\"message\":\"다운로드할 데이터가 없습니다.\"}");
                return;
            }

            String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
            String fileName = "접속현황_" + days + "일_" + timestamp + ".xlsx";
            String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8).replaceAll("\\+", "%20");

            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
            response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");

            try (SXSSFWorkbook workbook = new SXSSFWorkbook(100);
                 OutputStream out = response.getOutputStream()) {

                Sheet sheet = workbook.createSheet("일별접속통계");

                // 헤더 스타일
                CellStyle headerStyle = workbook.createCellStyle();
                headerStyle.setAlignment(HorizontalAlignment.CENTER);
                headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
                headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                Font headerFont = workbook.createFont();
                headerFont.setBold(true);
                headerStyle.setFont(headerFont);

                // 숫자 스타일
                CellStyle numberStyle = workbook.createCellStyle();
                numberStyle.setAlignment(HorizontalAlignment.RIGHT);
                DataFormat format = workbook.createDataFormat();
                numberStyle.setDataFormat(format.getFormat("#,##0"));

                // 헤더 생성
                Row headerRow = sheet.createRow(0);
                String[] headers = {"No", "일자", "서버코드", "서버명", "일 누적 접속수"};
                for (int i = 0; i < headers.length; i++) {
                    Cell cell = headerRow.createCell(i);
                    cell.setCellValue(headers[i]);
                    cell.setCellStyle(headerStyle);
                }

                // 데이터 생성
                int rowNum = 1;
                for (Map<String, Object> row : data) {
                    Row dataRow = sheet.createRow(rowNum);

                    // No
                    Cell noCell = dataRow.createCell(0);
                    noCell.setCellValue(rowNum);

                    // 일자
                    Cell dateCell = dataRow.createCell(1);
                    String totYmd = String.valueOf(row.get("totymd"));
                    if (totYmd != null && totYmd.length() == 8) {
                        dateCell.setCellValue(totYmd.substring(0, 4) + "-" + totYmd.substring(4, 6) + "-" + totYmd.substring(6, 8));
                    } else {
                        dateCell.setCellValue(totYmd);
                    }

                    // 서버코드
                    Cell srvrCdCell = dataRow.createCell(2);
                    srvrCdCell.setCellValue(String.valueOf(row.get("srvrcd")));

                    // 서버명
                    Cell srvrNmCell = dataRow.createCell(3);
                    srvrNmCell.setCellValue(String.valueOf(row.get("srvrnm")));

                    // 일 누적 접속수
                    Cell acmlCntCell = dataRow.createCell(4);
                    Object acmlCnt = row.get("acmlcnt");
                    if (acmlCnt instanceof Number) {
                        acmlCntCell.setCellValue(((Number) acmlCnt).doubleValue());
                        acmlCntCell.setCellStyle(numberStyle);
                    } else {
                        acmlCntCell.setCellValue(String.valueOf(acmlCnt));
                    }

                    rowNum++;
                }

                // 컬럼 너비 설정
                sheet.setColumnWidth(0, 2000);  // No
                sheet.setColumnWidth(1, 4000);  // 일자
                sheet.setColumnWidth(2, 4000);  // 서버코드
                sheet.setColumnWidth(3, 6000);  // 서버명
                sheet.setColumnWidth(4, 5000);  // 일 누적 접속수

                workbook.write(out);
                out.flush();

                log.info("일별 접속 통계 엑셀 다운로드 완료 - rows: {}", data.size());
            }

        } catch (Exception e) {
            log.error("일별 접속 통계 엑셀 다운로드 오류", e);
            try {
                if (!response.isCommitted()) {
                    response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                    response.setContentType("application/json;charset=UTF-8");
                    response.getWriter().write("{\"success\":false,\"message\":\"엑셀 다운로드 중 오류가 발생했습니다.\"}");
                }
            } catch (Exception ex) {
                log.error("에러 응답 전송 실패", ex);
            }
        }
    }
}