package com.example.demo.controller;

import com.example.demo.model.LogRecord;
import com.example.demo.service.LogService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 日志审计管理控制器。
 * 提供登录日志、操作日志、异常日志的记录和多条件日志溯源查询等 RESTful API 接口。
 */
@RestController
@RequestMapping("/api/log")
@Tag(name = "日志审计管理", description = "登录日志、操作日志、异常日志记录及溯源查询接口")
public class LogController {

    private final LogService logService;

    public LogController(LogService logService) {
        this.logService = logService;
    }

    /**
     * 记录登录日志。
     *
     * @requirement(name="登录日志记录", id="SRS-IMS_F-023")
     *
     * @param logRecord 登录日志信息
     * @return 记录后的日志
     */
    @PostMapping("/login")
    @Operation(summary = "记录登录日志", description = "记录用户登录日志")
    public LogRecord recordLoginLog(@RequestBody LogRecord logRecord) {
        return logService.recordLoginLog(logRecord);
    }

    /**
     * 记录操作日志。
     *
     * @requirement(name="操作日志记录", id="SRS-IMS_F-024")
     *
     * @param logRecord 操作日志信息
     * @return 记录后的日志
     */
    @PostMapping("/operation")
    @Operation(summary = "记录操作日志", description = "记录用户操作日志")
    public LogRecord recordOperationLog(@RequestBody LogRecord logRecord) {
        return logService.recordOperationLog(logRecord);
    }

    /**
     * 记录异常日志。
     *
     * @requirement(name="异常日志记录", id="SRS-IMS_F-025")
     *
     * @param logRecord 异常日志信息
     * @return 记录后的日志
     */
    @PostMapping("/exception")
    @Operation(summary = "记录异常日志", description = "记录系统异常日志")
    public LogRecord recordExceptionLog(@RequestBody LogRecord logRecord) {
        return logService.recordExceptionLog(logRecord);
    }

    /**
     * 多条件日志溯源查询。
     *
     * @requirement(name="日志溯源查询", id="SRS-IMS_F-026")
     *
     * @param logType     日志类型（login/operation/exception，可选）
     * @param operatorId  操作人ID（可选）
     * @param keyword     内容关键字（可选）
     * @param startTime   开始时间（可选）
     * @param endTime     结束时间（可选）
     * @param page        页码，默认0
     * @param size        每页条数，默认10
     * @return 符合条件的日志列表
     */
    @GetMapping
    @Operation(summary = "日志溯源查询", description = "多条件组合查询日志记录")
    public List<LogRecord> queryLogs(
            @Parameter(description = "日志类型(login/operation/exception)") @RequestParam(required = false) String logType,
            @Parameter(description = "操作人ID") @RequestParam(required = false) Long operatorId,
            @Parameter(description = "内容关键字") @RequestParam(required = false) String keyword,
            @Parameter(description = "开始时间(yyyy-MM-dd'T'HH:mm:ss)") @RequestParam(required = false)
            @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime startTime,
            @Parameter(description = "结束时间(yyyy-MM-dd'T'HH:mm:ss)") @RequestParam(required = false)
            @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime endTime,
            @Parameter(description = "页码") @RequestParam(defaultValue = "0") int page,
            @Parameter(description = "每页条数") @RequestParam(defaultValue = "10") int size) {
        return logService.queryLogs(logType, operatorId, keyword, startTime, endTime, page, size);
    }
}
