#include "casbin/pch.h"

#ifndef IP_CPP
#define IP_CPP

#include "casbin/ip_parser/parser/IP.h"

namespace casbin {

byte IP ::IPv4len = 4;
byte IP ::IPv6len = 16;
IPMask IP ::v4InV6Prefix{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff};

IP ::IP() {
    isLegal = true;
}

IP IP ::Mask(IPMask mask) {
    if (mask.size() == IPv6len && ip.size() == IPv4len) {
        IPMask mask_2(mask.begin(), mask.begin() + 12);
        if (allFF(mask_2)) {
            IPMask mask_3(mask.begin() + 12, mask.end());
            mask = mask_3;
        }
    }
    if (mask.size() == IPv4len && ip.size() == IPv6len) {
        IPMask ip_2(ip.begin(), ip.begin() + 12);
        if (equal(ip_2, v4InV6Prefix)) {
            IPMask ip_3(ip.begin() + 12, ip.end());
            ip = ip_3;
        }
    }
    unsigned int n = int(ip.size());
    if (n != mask.size()) {
        IP ip_mask;
        ip_mask.isLegal = false;
        return ip_mask;
    }
    IP out;
    std::vector<byte> outNew(n, 0);
    out.ip = outNew;
    out.isLegal = true;
    for (int i = 0; i < int(n); i++) {
        out.ip[i] = ip[i] & mask[i];
    }
    return out;
}

bool IP ::Equal(IP x) {
    if (ip.size() == x.ip.size()) {
        return equal(ip, x.ip);
    }
    if (ip.size() == IPv4len && x.ip.size() == IPv6len) {
        std::vector<byte> xNew1(x.ip.begin(), x.ip.begin() + 12);
        std::vector<byte> xNew2(x.ip.begin() + 12, x.ip.end());
        return equal(xNew1, v4InV6Prefix) && equal(ip, xNew2);
    }
    if (ip.size() == IPv6len && x.ip.size() == IPv4len) {
        std::vector<byte> ipNew1(ip.begin(), ip.begin() + 12);
        std::vector<byte> ipNew2(ip.begin() + 12, ip.end());
        return equal(ipNew1, v4InV6Prefix) && equal(ipNew2, x.ip);
    }
    return false;
}

std::string IP ::toString() {
    std::string ip1, ip2, ip3, ip4;
    std::stringstream ss1, ss2, ss3, ss4;
    ss1 << ip[12];
    ss1 >> ip1;
    ss2 << ip[13];
    ss2 >> ip2;
    ss3 << ip[14];
    ss3 >> ip3;
    ss4 << ip[15];
    ss4 >> ip4;
    return ip1 + "." + ip2 + "." + ip3 + "." + ip4;
}

// To4 converts the IPv4 address ip to a 4-byte representation.
// If ip is not an IPv4 address, To4 returns nil.
IP IP ::To4() {
    if (ip.size() == IPv4len) {
        return *this;
    }
    IP ipNew;
    std::vector<byte> ipN(ip.begin(), ip.begin() + 10);
    ipNew.ip = ipN;
    if (ip.size() == IPv6len && isZeros(ipNew) && ip[10] == 0xff && ip[11] == 0xff) {
        IP ipNew2;
        std::vector<byte> ipN(ip.begin() + 12, ip.begin() + 16);
        ipNew2.ip = ipN;
        return ipNew2;
    }
    this->isLegal = false;
    return *this;
}

// Is p all zeros?
bool IP ::isZeros(IP p) {
    for (int i = 0; i < p.ip.size(); i++) {
        if (p.ip[i] != 0) {
            return false;
        }
    }
    return true;
}

} // namespace casbin

#endif // IP_CPP
