<?php
/**
 * IoT Devices Management API
 * Complete CRUD operations with enhanced features
 */

header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, PATCH');
header('Access-Control-Allow-Headers: Content-Type');

require_once '../../config/database.php';

try {
    $database = new Database();
    $db = $database->getConnection();
    
    if (!$db) {
        throw new Exception('Database connection failed');
    }
    
    $method = $_SERVER['REQUEST_METHOD'];
    
    // GET: List devices or get single device
    if ($method === 'GET') {
        $device_id = $_GET['device_id'] ?? null;
        $type = $_GET['type'] ?? null;
        $online_only = $_GET['online_only'] ?? false;
        
        if ($device_id) {
            // Get single device with stats
            $query = "SELECT d.*, 
                      (SELECT COUNT(*) FROM iot_commands WHERE device_id = d.device_id AND status = 'pending') as pending_commands,
                      (SELECT COUNT(*) FROM iot_logs WHERE device_id = d.device_id AND log_type = 'error' AND DATE(created_at) = CURDATE()) as today_errors
                      FROM iot_devices d WHERE d.device_id = ?";
            $stmt = $db->prepare($query);
            $stmt->execute([$device_id]);
            $device = $stmt->fetch(PDO::FETCH_ASSOC);
            
            if ($device) {
                $device['pin_config'] = json_decode($device['pin_config'], true);
                echo json_encode(['success' => true, 'device' => $device]);
            } else {
                http_response_code(404);
                echo json_encode(['success' => false, 'error' => 'Device not found']);
            }
        } else {
            // Get all devices with filters
            $query = "SELECT d.*, 
                      (SELECT COUNT(*) FROM iot_commands WHERE device_id = d.device_id AND status = 'pending') as pending_commands
                      FROM iot_devices d WHERE 1=1";
            $params = [];
            
            if ($type) {
                $query .= " AND d.device_type = ?";
                $params[] = $type;
            }
            
            if ($online_only) {
                $query .= " AND d.is_online = 1";
            }
            
            $query .= " ORDER BY d.is_online DESC, d.last_seen DESC";
            
            $stmt = $db->prepare($query);
            $stmt->execute($params);
            $devices = $stmt->fetchAll(PDO::FETCH_ASSOC);
            
            foreach ($devices as &$device) {
                $device['pin_config'] = json_decode($device['pin_config'], true);
            }
            
            echo json_encode(['success' => true, 'devices' => $devices, 'count' => count($devices)]);
        }
    }
    
    // POST: Add new device
    elseif ($method === 'POST') {
        $device_id = $_POST['device_id'] ?? '';
        $device_name = $_POST['device_name'] ?? '';
        $device_type = $_POST['device_type'] ?? 'esp8266';
        $description = $_POST['description'] ?? '';
        $location = $_POST['location'] ?? '';
        $pin_config = $_POST['pin_config'] ?? '{"relay_pin": 5, "led_pin": 2}';
        
        if (empty($device_id) || empty($device_name)) {
            http_response_code(400);
            echo json_encode(['success' => false, 'error' => 'device_id and device_name are required']);
            exit;
        }
        
        // Validate JSON
        $pin_config_array = json_decode($pin_config, true);
        if (json_last_error() !== JSON_ERROR_NONE) {
            $pin_config = '{"relay_pin": 5, "led_pin": 2}';
        }
        
        $query = "INSERT INTO iot_devices (device_id, device_name, device_type, description, location, pin_config) 
                  VALUES (?, ?, ?, ?, ?, ?)";
        $stmt = $db->prepare($query);
        
        if ($stmt->execute([$device_id, $device_name, $device_type, $description, $location, $pin_config])) {
            // Log the action
            $log_query = "INSERT INTO iot_logs (device_id, log_type, message) VALUES (?, 'info', 'Device registered')";
            $db->prepare($log_query)->execute([$device_id]);
            
            echo json_encode([
                'success' => true,
                'message' => 'Device added successfully',
                'device_id' => $device_id
            ]);
        } else {
            http_response_code(500);
            echo json_encode(['success' => false, 'error' => 'Failed to add device']);
        }
    }
    
    // PUT: Update device
    elseif ($method === 'PUT') {
        parse_str(file_get_contents("php://input"), $_PUT);
        
        $device_id = $_PUT['device_id'] ?? '';
        
        if (empty($device_id)) {
            http_response_code(400);
            echo json_encode(['success' => false, 'error' => 'device_id is required']);
            exit;
        }
        
        $updates = [];
        $params = [];
        
        $allowed_fields = ['device_name', 'device_type', 'description', 'location', 'pin_config', 'is_active', 'firmware_version'];
        
        foreach ($allowed_fields as $field) {
            if (isset($_PUT[$field])) {
                $updates[] = "$field = ?";
                $params[] = $_PUT[$field];
            }
        }
        
        if (empty($updates)) {
            http_response_code(400);
            echo json_encode(['success' => false, 'error' => 'No fields to update']);
            exit;
        }
        
        $params[] = $device_id;
        $query = "UPDATE iot_devices SET " . implode(', ', $updates) . " WHERE device_id = ?";
        $stmt = $db->prepare($query);
        
        if ($stmt->execute($params)) {
            echo json_encode(['success' => true, 'message' => 'Device updated successfully']);
        } else {
            http_response_code(500);
            echo json_encode(['success' => false, 'error' => 'Failed to update device']);
        }
    }
    
    // PATCH: Toggle device active status
    elseif ($method === 'PATCH') {
        parse_str(file_get_contents("php://input"), $_PATCH);
        
        $device_id = $_PATCH['device_id'] ?? '';
        $action = $_PATCH['action'] ?? '';
        
        if (empty($device_id)) {
            http_response_code(400);
            echo json_encode(['success' => false, 'error' => 'device_id is required']);
            exit;
        }
        
        if ($action === 'toggle_active') {
            $query = "UPDATE iot_devices SET is_active = NOT is_active WHERE device_id = ?";
            $stmt = $db->prepare($query);
            
            if ($stmt->execute([$device_id])) {
                echo json_encode(['success' => true, 'message' => 'Device status toggled']);
            } else {
                http_response_code(500);
                echo json_encode(['success' => false, 'error' => 'Failed to toggle status']);
            }
        } else {
            http_response_code(400);
            echo json_encode(['success' => false, 'error' => 'Invalid action']);
        }
    }
    
    // DELETE: Remove device
    elseif ($method === 'DELETE') {
        parse_str(file_get_contents("php://input"), $_DELETE);
        $device_id = $_DELETE['device_id'] ?? '';
        
        if (empty($device_id)) {
            http_response_code(400);
            echo json_encode(['success' => false, 'error' => 'device_id is required']);
            exit;
        }
        
        $query = "DELETE FROM iot_devices WHERE device_id = ?";
        $stmt = $db->prepare($query);
        
        if ($stmt->execute([$device_id])) {
            echo json_encode(['success' => true, 'message' => 'Device deleted successfully']);
        } else {
            http_response_code(500);
            echo json_encode(['success' => false, 'error' => 'Failed to delete device']);
        }
    }
    
    else {
        http_response_code(405);
        echo json_encode(['success' => false, 'error' => 'Method not allowed']);
    }
    
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'error' => $e->getMessage()
    ]);
}
?>
