<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
header('Content-Type: application/json');
include_once 'config.php';

// Database connection
$conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($conn->connect_error) {
    die(json_encode(['error' => 'Database connection failed']));
}

$method = $_SERVER['REQUEST_METHOD'];
$table = $_GET['table'] ?? null;

function clean($data) {
    global $conn;
    return mysqli_real_escape_string($conn, trim($data));
}

if (!$table) {
    echo json_encode(['error' => 'Table parameter is required']);
    exit;
}

/* ===================================================
   ============  ADS_CAMPAIGNS TABLE API  ============
   =================================================== */
if ($table == 'ads_campaigns') {
    switch ($method) {

        // 🔹 READ (GET)
        case 'GET':
            if (isset($_GET['campaign_id'])) {
                $id = intval($_GET['campaign_id']);
                $sql = "SELECT * FROM ads_campaigns WHERE campaign_id = $id";
            } else {
                $sql = "SELECT * FROM ads_campaigns ORDER BY campaign_created_date DESC";
            }
            $result = $conn->query($sql);
            $data = [];
            while ($row = $result->fetch_assoc()) {
                $data[] = $row;
            }
            echo json_encode($data);
            break;

        // 🔹 CREATE (POST)
        case 'POST':
            $input = json_decode(file_get_contents('php://input'), true);
            $fields = [
                'campaign_user_id', 'campaign_title', 'campaign_start_date',
                'campaign_end_date', 'campaign_budget', 'campaign_spend',
                'campaign_bidding', 'audience_countries', 'audience_gender',
                'audience_relationship', 'ads_title', 'ads_description', 'ads_type',
                'ads_url', 'ads_post_url', 'ads_page', 'ads_group', 'ads_event',
                'ads_placement', 'ads_image', 'campaign_created_date',
                'campaign_is_active', 'campaign_is_approved', 'campaign_is_declined',
                'campaign_views', 'campaign_clicks'
            ];

            $cols = [];
            $vals = [];
            foreach ($fields as $field) {
                if (isset($input[$field])) {
                    $cols[] = $field;
                    $vals[] = "'" . clean($input[$field]) . "'";
                }
            }
            $sql = "INSERT INTO ads_campaigns (" . implode(',', $cols) . ") VALUES (" . implode(',', $vals) . ")";
            if ($conn->query($sql)) {
                echo json_encode(['success' => true, 'campaign_id' => $conn->insert_id]);
            } else {
                echo json_encode(['error' => $conn->error]);
            }
            break;

        // 🔹 UPDATE (PUT)
        case 'PUT':
            if (!isset($_GET['campaign_id'])) {
                echo json_encode(['error' => 'campaign_id required']);
                break;
            }
            $id = intval($_GET['campaign_id']);
            $input = json_decode(file_get_contents('php://input'), true);
            $updates = [];
            foreach ($input as $key => $value) {
                $updates[] = "$key='" . clean($value) . "'";
            }
            $sql = "UPDATE ads_campaigns SET " . implode(',', $updates) . " WHERE campaign_id=$id";
            if ($conn->query($sql)) {
                echo json_encode(['success' => true]);
            } else {
                echo json_encode(['error' => $conn->error]);
            }
            break;

        // 🔹 DELETE
        case 'DELETE':
            if (!isset($_GET['campaign_id'])) {
                echo json_encode(['error' => 'campaign_id required']);
                break;
            }
            $id = intval($_GET['campaign_id']);
            $sql = "DELETE FROM ads_campaigns WHERE campaign_id=$id";
            if ($conn->query($sql)) {
                echo json_encode(['success' => true]);
            } else {
                echo json_encode(['error' => $conn->error]);
            }
            break;

        default:
            echo json_encode(['error' => 'Invalid request method']);
    }
}

/* ===================================================
   ===============  ADS_SYSTEM TABLE API  =============
   =================================================== */
elseif ($table == 'ads_system') {
    switch ($method) {
        case 'GET':
            if (isset($_GET['ads_id'])) {
                $id = intval($_GET['ads_id']);
                $sql = "SELECT * FROM ads_system WHERE ads_id = $id";
            } else {
                $sql = "SELECT * FROM ads_system ORDER BY time DESC";
            }
            $result = $conn->query($sql);
            $data = [];
            while ($row = $result->fetch_assoc()) {
                $data[] = $row;
            }
            echo json_encode($data);
            break;

        case 'POST':
            $input = json_decode(file_get_contents('php://input'), true);
            $title = clean($input['title']);
            $place = clean($input['place']);
            $ads_pages_ids = clean($input['ads_pages_ids']);
            $ads_groups_ids = clean($input['ads_groups_ids']);
            $code = clean($input['code']);
            $time = date('Y-m-d H:i:s');
            $sql = "INSERT INTO ads_system (title, place, ads_pages_ids, ads_groups_ids, code, time)
                    VALUES ('$title','$place','$ads_pages_ids','$ads_groups_ids','$code','$time')";
            if ($conn->query($sql)) {
                echo json_encode(['success' => true, 'ads_id' => $conn->insert_id]);
            } else {
                echo json_encode(['error' => $conn->error]);
            }
            break;

        case 'PUT':
            if (!isset($_GET['ads_id'])) {
                echo json_encode(['error' => 'ads_id required']);
                break;
            }
            $id = intval($_GET['ads_id']);
            $input = json_decode(file_get_contents('php://input'), true);
            $updates = [];
            foreach ($input as $key => $value) {
                $updates[] = "$key='" . clean($value) . "'";
            }
            $sql = "UPDATE ads_system SET " . implode(',', $updates) . " WHERE ads_id=$id";
            if ($conn->query($sql)) {
                echo json_encode(['success' => true]);
            } else {
                echo json_encode(['error' => $conn->error]);
            }
            break;

        case 'DELETE':
            if (!isset($_GET['ads_id'])) {
                echo json_encode(['error' => 'ads_id required']);
                break;
            }
            $id = intval($_GET['ads_id']);
            $sql = "DELETE FROM ads_system WHERE ads_id=$id";
            if ($conn->query($sql)) {
                echo json_encode(['success' => true]);
            } else {
                echo json_encode(['error' => $conn->error]);
            }
            break;
    }
}

$conn->close();
?>
