// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

#ifndef PROXYCONTROLLER_H
#define PROXYCONTROLLER_H

#include "networkconst.h"
#include "netutils.h"

#include <QObject>

namespace dde {

namespace network {

class ProxyController : public QObject
{
    Q_OBJECT

    friend class NetworkInterProcesser;
    friend class NetworkManagerProcesser;

public:
    /* 系统代理 */
    void querySysProxyData();                    // 查询系统代理，一般在控制中心点击的时候实时调用
    void setProxyMethod(const ProxyMethod &pm);  // 设置代理模式
    inline ProxyMethod proxyMethod() const { return m_proxyMethod; }        // 返回代理模式
    void setProxyIgnoreHosts(const QString &hosts);                         // 设置忽略的主机
    inline QString proxyIgnoreHosts() const { return m_proxyIgnoreHosts; }  // 返回代理主机列表
    void setAutoProxy(const QString &proxy);                                // 设置自动代理的配置URL
    inline QString autoProxy() { return m_autoProxyURL; }                   // 返回自动代理的配置URL
    void setProxy(const SysProxyType &type,
                  const QString &addr,
                  const QString &port);  // 设置代理信息，type是一个枚举类型，一般是manual模式下设置
    void setProxyAuth(const SysProxyType &type,
                      const QString &userName,
                      const QString &password,
                      bool enable);                                         // 设置代理验证信息，type是一个枚举类型，一般是manual模式下设置
    SysProxyConfig proxy(const SysProxyType &type) const;                   // 获取对应类型下的系统代理数据
    bool systemProxyExist() const { return m_systemProxyExist; }

    /* 应用代理 */
    virtual bool appProxyEnabled() const;
    virtual void setAppProxyEnabled(bool) {}
    virtual void setAppProxy(const AppProxyConfig &) {}                     // 设置应用代理数据
    bool appProxyExist() const;
    AppProxyConfig appProxy() const;                                        // 获取应用代理数据

Q_SIGNALS:
    /* 系统代理 */
    void autoProxyChanged(const QString &);                                 // 自动代理发生变化
    void proxyChanged(const SysProxyConfig &);                              // 某种代理数据发生变化的时候触发的信号
    void proxyAuthChanged(const SysProxyConfig &);                          // 某种代理验证数据发生变化的时候触发的信号
    void proxyMethodChanged(const ProxyMethod &);                           // 代理模式发生变化
    void proxyIgnoreHostsChanged(const QString &);                          // 忽略的主机发生变化
    void systemProxyExistChanged(bool isExit);                              // 系统代理配置存在状态
    /* 应用代理 */
    void appEnableChanged(bool enabled);                                    // 应用代理是否启用状态发生变化
    void appIPChanged(const QString &ip);                                   // 应用代理IP发生变化
    void appPasswordChanged(const QString &password);                       // 应用代理密码发生变化
    void appTypeChanged(const AppProxyType &type);                          // 应用代理类型发生变化
    void appUsernameChanged(const QString &username);                       // 应用代理用户名发生变化
    void appPortChanged(const uint &port);                                  // 应用代理端口发生变化

protected:
    explicit ProxyController(QObject *parent = Q_NULLPTR);
    ~ProxyController();

    void queryAutoProxy();                                                  // 查询自动代理的URL
    void queryProxyMethod();                                                // 查询自动代理模式
    void queryProxyIgnoreHosts();                                           // 查询代理忽略的主机

    void queryProxyDataByType(const QString &type);                         // 查询代理数据
    void queryProxyAuthByType(const QString &type);                     // 查询代理验证数据

    ProxyMethod convertProxyMethod(const QString &method);                  // 将代理模式字符串转换为枚举
    QString convertProxyMethod(const ProxyMethod &method);                  // 将代理模式枚举转换为字符串

    QString convertSysProxyType(const SysProxyType &type);                  // 将代理模式枚举值转换为字符串
    SysProxyType convertSysProxyType(const QString &type);                  // 将代理模式字符串转换为枚举值

    AppProxyType appProxyType(const QString &v);                            // 系统代理类型转换，字符串到枚举
    QString appProxyType(const AppProxyType &v);                            // 系统代理类型转换，枚举到字符串

protected Q_SLOTS:
    void onIPChanged(const QString &value);
    void onPasswordChanged(const QString &value);
    void onTypeChanged(const QString &value);
    void onUserChanged(const QString &value);
    void onPortChanged(uint value);
    void onProxyMethodChanged(const QString &method);

private:
    NetworkInter *m_networkInter;
    QList<SysProxyConfig> m_sysProxyConfig;
    QString m_autoProxyURL;
    ProxyMethod m_proxyMethod;
    QString m_proxyIgnoreHosts;
    AppProxyConfig m_appProxyConfig;
    bool m_appProxyExist;
    bool m_systemProxyExist;
};

}

}

#endif  // PROXYCONTROLLER_H
