#pragma once

#include <xmlrpc-c/base.hpp>
#include <xmlrpc-c/registry.hpp>

namespace STG
{

struct Admins;
class Tariffs;
class Users;
struct Store;
struct IPMask;

}

class RPC_CONFIG;

class METHOD_USER_GET : public xmlrpc_c::method {
public:
    METHOD_USER_GET(RPC_CONFIG * c,
                    STG::Users * u)
        : config(c),
          users(u)
    {
    }

    void execute(xmlrpc_c::paramList const & paramList,
                 xmlrpc_c::value *   const   retvalP);

private:
    METHOD_USER_GET(const METHOD_USER_GET & rvalue);
    METHOD_USER_GET & operator=(const METHOD_USER_GET & rvalue);

    RPC_CONFIG * config;
    STG::Users * users;
};

class METHOD_USER_ADD : public xmlrpc_c::method {
public:
    METHOD_USER_ADD(RPC_CONFIG * c,
                    STG::Admins * a,
                    STG::Users * u)
        : config(c),
          admins(a),
          users(u)
    {
    }

    void execute(xmlrpc_c::paramList const & paramList,
                 xmlrpc_c::value *   const   retvalP);

private:
    METHOD_USER_ADD(const METHOD_USER_ADD & rvalue);
    METHOD_USER_ADD & operator=(const METHOD_USER_ADD & rvalue);

    RPC_CONFIG * config;
    STG::Admins * admins;
    STG::Users * users;
};

class METHOD_USER_DEL : public xmlrpc_c::method {
public:
    METHOD_USER_DEL(RPC_CONFIG * c,
                    STG::Admins * a,
                    STG::Users * u)
        : config(c),
          admins(a),
          users(u)
    {
    }

    void execute(xmlrpc_c::paramList const & paramList,
                 xmlrpc_c::value *   const   retvalP);

private:
    METHOD_USER_DEL(const METHOD_USER_DEL & rvalue);
    METHOD_USER_DEL & operator=(const METHOD_USER_DEL & rvalue);

    RPC_CONFIG * config;
    STG::Admins * admins;
    STG::Users * users;
};

class METHOD_USERS_GET : public xmlrpc_c::method {
public:
    METHOD_USERS_GET(RPC_CONFIG * c,
                     STG::Users * u)
        : config(c),
          users(u)
    {
    }

    void execute(xmlrpc_c::paramList const & paramList,
                 xmlrpc_c::value *   const   retvalP);

private:
    METHOD_USERS_GET(const METHOD_USERS_GET & rvalue);
    METHOD_USERS_GET & operator=(const METHOD_USERS_GET & rvalue);

    RPC_CONFIG * config;
    STG::Users * users;
};

class METHOD_USER_CHG : public xmlrpc_c::method {
public:
    METHOD_USER_CHG(RPC_CONFIG * c,
                    STG::Admins * a,
                    STG::Tariffs * t,
                    STG::Store * s,
                    STG::Users * u)
        : config(c),
          admins(a),
          tariffs(t),
          store(s),
          users(u)
    {
    }

    void execute(xmlrpc_c::paramList const & paramList,
                 xmlrpc_c::value *   const   retvalP);

private:
    METHOD_USER_CHG(const METHOD_USER_CHG & rvalue);
    METHOD_USER_CHG & operator=(const METHOD_USER_CHG & rvalue);

    RPC_CONFIG * config;
    STG::Admins * admins;
    STG::Tariffs * tariffs;
    STG::Store * store;
    STG::Users * users;
};

class METHOD_USER_CASH_ADD : public xmlrpc_c::method {
public:
    METHOD_USER_CASH_ADD(RPC_CONFIG * c,
                         STG::Admins * a,
                         STG::Store * s,
                         STG::Users * u)
        : config(c),
          admins(a),
          store(s),
          users(u)
    {
    }

    void execute(xmlrpc_c::paramList const & paramList,
                 xmlrpc_c::value *   const   retvalP);

private:
    METHOD_USER_CASH_ADD(const METHOD_USER_CASH_ADD & rvalue);
    METHOD_USER_CASH_ADD & operator=(const METHOD_USER_CASH_ADD & rvalue);

    RPC_CONFIG * config;
    STG::Admins * admins;
    STG::Store * store;
    STG::Users * users;
};

class METHOD_USER_CASH_SET : public xmlrpc_c::method {
public:
    METHOD_USER_CASH_SET(RPC_CONFIG * c,
                         STG::Admins * a,
                         STG::Store * s,
                         STG::Users * u)
        : config(c),
          admins(a),
          store(s),
          users(u)
    {
    }

    void execute(xmlrpc_c::paramList const & paramList,
                 xmlrpc_c::value *   const   retvalP);

private:
    METHOD_USER_CASH_SET(const METHOD_USER_CASH_SET & rvalue);
    METHOD_USER_CASH_SET & operator=(const METHOD_USER_CASH_SET & rvalue);

    RPC_CONFIG * config;
    STG::Admins * admins;
    STG::Store * store;
    STG::Users * users;
};

class METHOD_USER_TARIFF_CHANGE : public xmlrpc_c::method {
public:
    METHOD_USER_TARIFF_CHANGE(RPC_CONFIG * c,
                              STG::Admins * a,
                              STG::Tariffs * t,
                              STG::Store * s,
                              STG::Users * u)
        : config(c),
          admins(a),
          tariffs(t),
          store(s),
          users(u)
    {
    }

    void execute(xmlrpc_c::paramList const & paramList,
                 xmlrpc_c::value *   const   retvalP);

private:
    METHOD_USER_TARIFF_CHANGE(const METHOD_USER_TARIFF_CHANGE & rvalue);
    METHOD_USER_TARIFF_CHANGE & operator=(const METHOD_USER_TARIFF_CHANGE & rvalue);

    RPC_CONFIG * config;
    STG::Admins * admins;
    STG::Tariffs * tariffs;
    STG::Store * store;
    STG::Users * users;
};

class METHOD_GET_ONLINE_IPS : public xmlrpc_c::method {
public:
    METHOD_GET_ONLINE_IPS(RPC_CONFIG * c,
                          STG::Users * u)
        : config(c),
          users(u)
    {
    }

    void execute(xmlrpc_c::paramList const & paramList,
                 xmlrpc_c::value *   const   retvalP);

private:
    METHOD_GET_ONLINE_IPS(const METHOD_GET_ONLINE_IPS & rvalue);
    METHOD_GET_ONLINE_IPS & operator=(const METHOD_GET_ONLINE_IPS & rvalue);

    RPC_CONFIG * config;
    STG::Users * users;

    bool ParseNet(const std::string & net, STG::IPMask & ipm) const;
};

class METHOD_GET_USER_AUTH_BY : public xmlrpc_c::method {
public:
    METHOD_GET_USER_AUTH_BY(RPC_CONFIG * c,
                            STG::Users * u)
        : config(c),
          users(u)
    {
    }

    void execute(xmlrpc_c::paramList const & paramList,
                 xmlrpc_c::value *   const   retvalP);

private:
    METHOD_GET_USER_AUTH_BY(const METHOD_GET_ONLINE_IPS & rvalue);
    METHOD_GET_USER_AUTH_BY & operator=(const METHOD_GET_ONLINE_IPS & rvalue);

    RPC_CONFIG * config;
    STG::Users * users;
};