<?php
// Enable error reporting for debugging (remove in production)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

require_once '../../../config/database.php';

header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');

// Handle preflight requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    http_response_code(200);
    exit();
}

// Only allow POST requests
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
    http_response_code(405);
    echo json_encode(['success' => false, 'error' => 'Method not allowed. Use POST.']);
    exit();
}

// Get POST data
$input = json_decode(file_get_contents('php://input'), true);

// If JSON decode fails, try getting form data
if (!$input) {
    $input = $_POST;
}

if (!$input || !is_array($input)) {
    http_response_code(400);
    echo json_encode(['success' => false, 'error' => 'Invalid or no data received']);
    exit();
}

// Log the received data for debugging
error_log("Messages batch received: " . count($input) . " messages");
error_log("First message sample: " . print_r($input[0] ?? 'No messages', true));

global $conn;

if (!$conn) {
    http_response_code(500);
    echo json_encode(['success' => false, 'error' => 'Database connection failed']);
    exit();
}

$success_count = 0;
$failed_count = 0;
$errors = [];

// Check if mobile_messages table exists, if not create it
$table_check = $conn->query("SHOW TABLES LIKE 'mobile_messages'");
if ($table_check->num_rows == 0) {
    // Create the messages table
    $create_table = "CREATE TABLE IF NOT EXISTS `mobile_messages` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `mobile_device_id` int(11) NOT NULL,
        `user_id` int(11) NOT NULL,
        `direction` enum('sent','received') NOT NULL,
        `phone_number` varchar(20) NOT NULL,
        `contact_name` varchar(255) DEFAULT NULL,
        `message_content` text NOT NULL,
        `message_type` enum('sms','mms') DEFAULT 'sms',
        `attachments` text DEFAULT NULL,
        `is_read` tinyint(1) DEFAULT 0,
        `message_date` datetime NOT NULL,
        `created_at` timestamp NULL DEFAULT current_timestamp(),
        PRIMARY KEY (`id`),
        UNIQUE KEY `unique_message` (`mobile_device_id`, `message_date`, `phone_number`, `direction`, `message_content`(100)),
        KEY `idx_mobile_device` (`mobile_device_id`),
        KEY `idx_user_id` (`user_id`),
        KEY `idx_message_date` (`message_date`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;";
    
    if (!$conn->query($create_table)) {
        error_log("Failed to create mobile_messages table: " . $conn->error);
    } else {
        error_log("mobile_messages table created successfully");
    }
}

// Process each message in the batch
foreach ($input as $index => $message) {
    
    // Extract fields with defaults
    $mobile_device_id = isset($message['mobileDeviceId']) ? (int)$message['mobileDeviceId'] : 0;
    $user_id = isset($message['userId']) ? (int)$message['userId'] : 0;
    $direction = isset($message['direction']) ? $conn->real_escape_string($message['direction']) : 'received';
    $phone_number = isset($message['phoneNumber']) ? $conn->real_escape_string($message['phoneNumber']) : '';
    $contact_name = isset($message['contactName']) ? $conn->real_escape_string($message['contactName']) : null;
    $message_content = isset($message['messageContent']) ? $conn->real_escape_string($message['messageContent']) : '';
    $message_type = isset($message['messageType']) ? $conn->real_escape_string($message['messageType']) : 'sms';
    $attachments = isset($message['attachments']) ? $conn->real_escape_string($message['attachments']) : null;
    $is_read = isset($message['isRead']) ? (int)$message['isRead'] : 0;
    
    // Handle message date - can be in different formats
    $message_date = date('Y-m-d H:i:s'); // Default to now
    if (isset($message['messageDate'])) {
        if (is_numeric($message['messageDate'])) {
            // If it's a timestamp
            $message_date = date('Y-m-d H:i:s', $message['messageDate'] / 1000); // Convert milliseconds to seconds
        } else {
            // If it's a string date
            $message_date = date('Y-m-d H:i:s', strtotime($message['messageDate']));
        }
    }
    
    // Validate required fields
    if ($mobile_device_id == 0 || $user_id == 0 || empty($phone_number)) {
        $failed_count++;
        $errors[] = "Message $index: Missing required fields (device_id: $mobile_device_id, user_id: $user_id, phone: $phone_number)";
        continue;
    }
    
    // Check if device exists
    $device_check = $conn->query("SELECT id FROM mobile_devices WHERE id = $mobile_device_id");
    if ($device_check->num_rows == 0) {
        $failed_count++;
        $errors[] = "Message $index: Device ID $mobile_device_id does not exist";
        continue;
    }
    
    // Check for duplicate using a more reliable method
    // Create a content preview for checking
    $content_preview = substr($message_content, 0, 255);
    
    $check_sql = "SELECT id FROM mobile_messages 
                  WHERE mobile_device_id = ? 
                  AND phone_number = ? 
                  AND DATE(message_date) = DATE(?)
                  AND direction = ?
                  AND message_content = ?";
    
    $check_stmt = $conn->prepare($check_sql);
    $check_stmt->bind_param("issss", $mobile_device_id, $phone_number, $message_date, $direction, $content_preview);
    $check_stmt->execute();
    $check_result = $check_stmt->get_result();
    
    if ($check_result->num_rows > 0) {
        // Message already exists, skip
        $success_count++; // Count as success (already have it)
        $check_stmt->close();
        continue;
    }
    $check_stmt->close();
    
    // Insert the message
    $insert_sql = "INSERT INTO mobile_messages 
                   (mobile_device_id, user_id, direction, phone_number, contact_name, message_content, message_type, attachments, is_read, message_date, created_at) 
                   VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())";
    
    $insert_stmt = $conn->prepare($insert_sql);
    $insert_stmt->bind_param("iissssssis", 
        $mobile_device_id, 
        $user_id, 
        $direction, 
        $phone_number, 
        $contact_name, 
        $message_content, 
        $message_type, 
        $attachments, 
        $is_read, 
        $message_date
    );
    
    if ($insert_stmt->execute()) {
        $success_count++;
        error_log("Message $index inserted with ID: " . $insert_stmt->insert_id);
    } else {
        $failed_count++;
        $errors[] = "Message $index: Failed to insert - " . $conn->error;
        error_log("Failed to insert message $index: " . $conn->error);
    }
    
    $insert_stmt->close();
}

// Update device last activity
if ($success_count > 0 && isset($input[0]['mobileDeviceId'])) {
    $device_id = (int)$input[0]['mobileDeviceId'];
    $update_device = "UPDATE mobile_devices SET last_activity = NOW(), updated_at = NOW() WHERE id = ?";
    $update_stmt = $conn->prepare($update_device);
    $update_stmt->bind_param("i", $device_id);
    $update_stmt->execute();
    $update_stmt->close();
}

// Return response
echo json_encode([
    'success' => true,
    'saved' => $success_count,
    'failed' => $failed_count,
    'total' => count($input),
    'errors' => $errors,
    'message' => "Processed " . count($input) . " messages: $success_count saved, $failed_count failed"
]);

error_log("Messages batch completed: $success_count saved, $failed_count failed");
?>