<?php
// Thông tin kết nối cơ sở dữ liệu
$host = 'imunify360.hostsvc.com';  // hoặc IP của server cơ sở dữ liệu
$dbname = 'kdatavn53_ip';  // tên cơ sở dữ liệu
$username = 'kdatavn53_ip';  // tên người dùng
$password = 'bs-mN5866Wk{';  // mật khẩu
try {
    // Tạo kết nối PDO
    $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
    // Thiết lập chế độ lỗi
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    if ($_SERVER['REQUEST_METHOD'] === 'GET') {
        if (!empty($_GET['ip_address'])) {
            $ip = $_GET['ip_address'];
        } else {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        if (isValidIp($ip)) {
            $exists = getIp($pdo, $ip);
            if ($exists) {
                http_response_code(200);
                echo json_encode(['status' => 200, 'message' => 'IP hợp lệ']);
            } else {
                http_response_code(403); 
                echo json_encode(['status' => 403, 'message' => 'IP không hợp lệ']);
            }
        } else {
            http_response_code(400); 
            echo json_encode(['status' => 400, 'message' => 'IP ' . $ip . ' không đúng định dạng']);
        }
    } elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
        if (!empty($_POST['ip_address'])) {
            $ip = $_POST['ip_address'];
        } else {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        if (isValidIp($ip)) {
            return postIp($pdo, $ip);
        } else {
            http_response_code(403); 
            echo json_encode(['status' => 403, 'message' => 'IP không hợp lệ']);
        }
    } elseif ($_SERVER['REQUEST_METHOD'] === 'DELETE') {
        $data = requestData();
        if (!empty($data['ip_address'])) {
            $ip = $data['ip_address'];
        } else {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        if (isValidIp($ip)) {
            return deleteIp($pdo, $ip);
        } else {
            http_response_code(403); 
            echo json_encode(['status' => 403, 'message' => 'IP không hợp lệ']);
        }
    } elseif ($_SERVER['REQUEST_METHOD'] === 'PUT') {
        $data = requestData();
        if (!empty($data['ip_address'])) {
            $ip = $data['ip_address'];
        } else {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        $ipChange = $data['ip_change'];
        if (isValidIp($ip) && isValidIp($ipChange)) {
            echo updateIp($pdo, $ip, $ipChange);
        } else {
            http_response_code(403); 
            echo json_encode(['status' => 403, 'message' => 'IP không hợp lệ']);
        }
    } else {
        http_response_code(500); 
            echo json_encode(['status' => 500, 'message' => 'Có lỗi xãy ra.']);
    }
} catch (PDOException $e) {
    http_response_code(500); 
    echo json_encode(['status' => 500, 'message' => 'Có lỗi xãy ra.']);
}


// get ip
function getIp($pdo, $ip)
{
    $sql = "SELECT COUNT(*) FROM ip WHERE ip_address = :ip";
    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(':ip', $ip, PDO::PARAM_STR);
    $stmt->execute();
    $count = $stmt->fetchColumn();
    return $count > 0 ? 1 : 0;
}


function postIp($pdo, $ip)
{
    if (getIp($pdo, $ip) == 0) {
        $sql = "INSERT INTO ip (ip_address) VALUES (:ip)";
        $stmt = $pdo->prepare($sql);
        $stmt->bindParam(':ip', $ip, PDO::PARAM_STR);
        if ($stmt->execute()) {
                http_response_code(200);
                echo json_encode(['status' => 200, 'message' => 'IP đã được thêm vào cơ sở dữ liệu.']);
        } else {
            http_response_code(500); 
                echo json_encode(['status' => 500, 'message' => 'Có lỗi khi thêm IP vào cơ sở dữ liệu.']);
        }
    } else {
        http_response_code(403); 
        echo json_encode(['status' => 403, 'message' => 'IP đã tồn tại trong database.']);
    }
}

function deleteIp($pdo, $ip)
{
    if (getIp($pdo, $ip) == 1) {
        $sql = "DELETE FROM ip WHERE ip_address = :ip";
        $stmt = $pdo->prepare($sql);
        $stmt->bindParam(':ip', $ip, PDO::PARAM_STR);
        if ($stmt->execute()) {
            http_response_code(200);
                echo json_encode(['status' => 200, 'message' => 'IP đã được xóa khỏi cơ sở dữ liệu.']);
        } else {
            http_response_code(500); 
            echo json_encode(['status' => 500, 'message' => 'Có lỗi khi xoá IP khỏi cơ sở dữ liệu.']);
        }
    } else {
        http_response_code(403); 
        echo json_encode(['status' => 403, 'message' => 'Không tìm thấy IP.']);
    }
}
function updateIp($pdo, $oldIp, $newIp)
{
    if (getIp($pdo, $oldIp) == 1) {
        $sql = "UPDATE ip SET ip_address = :new_ip WHERE ip_address = :old_ip";
        $stmt = $pdo->prepare($sql);
        $stmt->bindParam(':old_ip', $oldIp, PDO::PARAM_STR);
        $stmt->bindParam(':new_ip', $newIp, PDO::PARAM_STR);
        if ($stmt->execute()) {

            http_response_code(200);
            echo json_encode(['status' => 200, 'message' => 'IP đã được cập nhật thành công.']);
        } else {
            http_response_code(500); 
            echo json_encode(['status' => 500, 'message' => 'Có lỗi khi xoá IP khỏi cơ sở dữ liệu.']);
        }
    } else {
        http_response_code(403); 
        echo json_encode(['status' => 403, 'message' => 'Không tìm thấy IP.']);
    }
}
function isValidIp($ip)
{
    return filter_var($ip, FILTER_VALIDATE_IP) !== false;
}

function requestData()
{
    $form_data = json_encode(file_get_contents("php://input"));
    $key_size = 52;
    $key = substr($form_data, 1, $key_size);
    $acc_params = explode($key, $form_data);
    array_shift($acc_params);
    array_pop($acc_params);
    foreach ($acc_params as $item) {
        $start_key = ' name=\"';
        $end_key = '\"\r\n\r\n';
        $start_key_pos = strpos($item, $start_key) + strlen($start_key);
        $end_key_pos = strpos($item, $end_key);

        $key = substr($item, $start_key_pos, ($end_key_pos - $start_key_pos));

        $end_value = '\r\n';
        $value = substr($item, $end_key_pos + strlen($end_key), -strlen($end_value));
        $_PUT[$key] = $value;
    }
    return $_PUT;
}
?>