/*
 *  Copyright (c) 2023-2026, Easy-Agents (fuhai999@gmail.com).
 *  <p>
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *  <p>
 *  http://www.apache.org/licenses/LICENSE-2.0
 *  <p>
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package com.easyagents.embedding.qwen;

import com.easyagents.core.document.Document;
import com.easyagents.core.model.client.HttpClient;
import com.easyagents.core.model.embedding.BaseEmbeddingModel;
import com.easyagents.core.model.embedding.EmbeddingOptions;
import com.easyagents.core.model.exception.ModelException;
import com.easyagents.core.store.VectorData;
import com.easyagents.core.util.JSONUtil;
import com.easyagents.core.util.Maps;
import com.easyagents.core.util.StringUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;

import java.util.HashMap;
import java.util.Map;

public class QwenEmbeddingModel extends BaseEmbeddingModel<QwenEmbeddingConfig> {

    private HttpClient httpClient = new HttpClient();

    public QwenEmbeddingModel(QwenEmbeddingConfig config) {
        super(config);
    }

    public HttpClient getHttpClient() {
        return httpClient;
    }

    public void setHttpClient(HttpClient httpClient) {
        this.httpClient = httpClient;
    }

    @Override
    public VectorData embed(Document document, EmbeddingOptions options) {
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        headers.put("Authorization", "Bearer " + getConfig().getApiKey());

        String payload = promptToEmbeddingsPayload(document, options, config);
        String endpoint = config.getEndpoint();
        // https://platform.openai.com/docs/api-reference/embeddings/create
        String response = httpClient.post(endpoint + config.getRequestPath(), headers, payload);

        if (StringUtil.noText(response)) {
            throw new ModelException("response is null or empty.");
        }

        JSONObject jsonObject = JSON.parseObject(response);
        String errorMessage = JSONUtil.detectErrorMessage(jsonObject);
        if (errorMessage != null) {
            throw new ModelException(errorMessage);
        }

        VectorData vectorData = new VectorData();
        double[] embedding = JSONUtil.readDoubleArray(jsonObject, "$.data[0].embedding");
        vectorData.setVector(embedding);

        return vectorData;
    }


    public static String promptToEmbeddingsPayload(Document text, EmbeddingOptions options, QwenEmbeddingConfig config) {
        //https://help.aliyun.com/zh/model-studio/developer-reference/embedding-interfaces-compatible-with-openai?spm=a2c4g.11186623.0.i3
        return Maps.of("model", options.getModelOrDefault(config.getModel()))
            .set("encoding_format", options.getEncodingFormatOrDefault("float"))
            .set("input", text.getContent())
            .setIfNotEmpty("user", options.getUser())
            .setIfNotEmpty("dimensions", options.getDimensions())
            .toJSON();
    }
}
