package com.zhengmeng.ocrplatform.extract;

import com.zhengmeng.ocrplatform.common.ApiResponse;
import com.zhengmeng.ocrplatform.integration.PluginIntegrationInterceptor;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/api/v1/ocr")
public class OcrExtractController {
    private final OcrExtractService extractService;

    public OcrExtractController(OcrExtractService extractService) {
        this.extractService = extractService;
    }

    @PostMapping("/extract")
    public ApiResponse<OcrExtractService.ExtractResponse> extract(@RequestPart(value = "files", required = false) List<MultipartFile> files,
                                                                  @RequestPart(value = "file", required = false) MultipartFile file,
                                                                  @RequestParam String keys,
                                                                  @RequestParam(required = false) String businessProfileId,
                                                                  @RequestParam(required = false) String sourceSystem,
                                                                  @RequestParam(required = false) String businessType,
                                                                  @RequestParam(defaultValue = "true") boolean sync,
                                                                  @RequestParam(defaultValue = "120") int timeoutSeconds,
                                                                  HttpServletRequest request) {
        return ApiResponse.ok(extractService.createExtractTask(
                mergeFiles(files, file),
                keys,
                businessProfileId,
                sourceSystem,
                businessType,
                sync,
                timeoutSeconds,
                clientCode(request)
        ));
    }

    @GetMapping("/extract-tasks/{taskId}")
    public ApiResponse<OcrExtractService.ExtractResponse> getExtractTask(@PathVariable String taskId,
                                                                        @RequestParam String keys,
                                                                        @RequestParam(required = false) String businessProfileId,
                                                                        HttpServletRequest request) {
        return ApiResponse.ok(extractService.getExtractTask(taskId, keys, businessProfileId, clientCode(request)));
    }

    private List<MultipartFile> mergeFiles(List<MultipartFile> files, MultipartFile file) {
        List<MultipartFile> merged = new ArrayList<>();
        if (files != null) {
            merged.addAll(files);
        }
        if (file != null) {
            merged.add(file);
        }
        return merged;
    }

    private String clientCode(HttpServletRequest request) {
        Object value = request.getAttribute(PluginIntegrationInterceptor.REQUEST_CLIENT_CODE);
        return value instanceof String clientCode ? clientCode : null;
    }
}
