package quant.rich.emoney.entity.sqlite;

import java.net.InetSocketAddress;
import java.net.Proxy;

import org.apache.commons.lang3.ObjectUtils;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore;

import jakarta.annotation.Nonnull;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import quant.rich.emoney.validator.ProxySettingValid;

/**
 * 平台代理配置。
 * <p>
 * SQLite 表 proxy_setting 使用触发器维护默认代理的一致性：新增或更新 is_default = 1
 * 时会把其他记录置为非默认；不允许把最后一条默认代理改为非默认，也不允许删除默认代理。
 * 这部分约束不在 Java 代码里重复实现，调整表结构或导入数据时需要同步检查触发器。
 */
@Data
@Accessors(chain = true)
@NoArgsConstructor
@TableName(value = "proxy_setting", autoResultMap = true)
@ProxySettingValid
public class ProxySetting {
    
    @TableId(value="id", type=IdType.AUTO)
    private Integer id;
    
    private Boolean isDefault;
    
    @Nonnull
    private String proxyName;
    
    private Proxy.Type proxyType = Proxy.Type.DIRECT;
    
    private String proxyHost = "";
    
    private Integer proxyPort = 1;
    
    private Boolean ignoreHttpsVerification = false;
    
    /**
     * 根据配置获取 java.net.Proxy
     * @return
     */
    @JsonIgnore
    public Proxy getProxy() {
        if (getProxyType() != null && getProxyType() != Proxy.Type.DIRECT) {
            return new Proxy(getProxyType(), 
                    new InetSocketAddress(getProxyHost(), getProxyPort()));
        }
        return Proxy.NO_PROXY;
    }
    
    /**
     * 根据当前配置获取 ProxyUrl(String)
     * <p>如：
     * <li>socks5://127.0.0.1:8888</li>
     * <li>http://10.0.0.1:7890</li>
     * </p>
     * @return
     */
    public String getProxyUrl() {
        if (ObjectUtils.anyNull(getProxyType(), getProxyHost(), getProxyPort())) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        if (getProxyType() == Proxy.Type.SOCKS) {
            sb.append("socks5://");
        }
        else if (getProxyType() == Proxy.Type.HTTP) {
            sb.append("http://");
        }
        else {
            return null;
        }
        sb.append(getProxyHost()).append(':').append(getProxyPort());
        return sb.toString();
    }

}
