package com.zhengmeng.ocrplatform.engine;

import org.springframework.boot.context.properties.ConfigurationProperties;

import java.net.URI;
import java.time.Duration;
import java.util.List;

@ConfigurationProperties(prefix = "ocr-platform.engine")
public record EngineProperties(
        String defaultCode,
        PaddleLayout paddleLayout,
        PpChatOcr ppChatOcr
) {
    public EngineProperties {
        if (defaultCode == null || defaultCode.isBlank()) {
            defaultCode = "paddle-layout";
        }
        if (paddleLayout == null) {
            paddleLayout = new PaddleLayout(false, URI.create("http://192.168.1.13:18080/layout-parsing"), Duration.ofSeconds(60));
        }
        if (ppChatOcr == null) {
            ppChatOcr = new PpChatOcr(false, URI.create("http://192.168.1.13:18083/chatocr-visual"), URI.create("http://192.168.1.13:18083/chatocr-chat"), Duration.ofSeconds(120), List.of());
        }
    }

    public record PaddleLayout(
            boolean enabled,
            URI endpoint,
            Duration timeout
    ) {
        public PaddleLayout {
            if (endpoint == null) {
                endpoint = URI.create("http://192.168.1.13:18080/layout-parsing");
            }
            if (timeout == null) {
                timeout = Duration.ofSeconds(60);
            }
        }
    }

    public record PpChatOcr(
            boolean enabled,
            URI visualEndpoint,
            URI chatEndpoint,
            Duration timeout,
            List<String> extractionKeys
    ) {
        public PpChatOcr {
            if (visualEndpoint == null) {
                visualEndpoint = URI.create("http://192.168.1.13:18083/chatocr-visual");
            }
            if (chatEndpoint == null) {
                chatEndpoint = URI.create("http://192.168.1.13:18083/chatocr-chat");
            }
            if (timeout == null) {
                timeout = Duration.ofSeconds(120);
            }
            if (extractionKeys == null) {
                extractionKeys = List.of();
            } else {
                extractionKeys = extractionKeys.stream()
                        .filter(value -> value != null && !value.isBlank())
                        .map(String::trim)
                        .toList();
            }
        }
    }

}
