// Define variables
var scene, camera, renderer, controls, clock;
var geometry, material, mesh;
var raycaster, mouse;
var enemies = [];
var towers = [];
var projectiles = [];

// Initialize game
init();
animate();

function init() {
    // Create scene
    scene = new THREE.Scene();

    // Create camera
    camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
    camera.position.set(0, 10, 20);

    // Create renderer
    renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);

    // Add controls
    controls = new THREE.OrbitControls(camera, renderer.domElement);

    // Add clock
    clock = new THREE.Clock();

    // Create ground
    geometry = new THREE.PlaneGeometry(100, 100);
    material = new THREE.MeshBasicMaterial({color: 0x00ff00, side: THREE.DoubleSide});
    mesh = new THREE.Mesh(geometry, material);
    mesh.rotateX(-Math.PI / 2);
    scene.add(mesh);

    // Add towers
    addTower(5, 0, 5);
    addTower(-5, 0, -5);

    // Add enemies
    addEnemy(0, 0, -10);
    addEnemy(0, 0, -20);

    // Add raycaster and mouse
    raycaster = new THREE.Raycaster();
    mouse = new THREE.Vector2();

    // Add event listeners
    window.addEventListener('resize', onWindowResize, false);
    window.addEventListener('click', onClick, false);
}

function animate() {
    requestAnimationFrame(animate);

    // Move enemies
    for (var i = 0; i < enemies.length; i++) {
        var enemy = enemies[i];
        enemy.position.z += 0.1;

        // Check if enemy is at end of path
        if (enemy.position.z > 10) {
            scene.remove(enemy);
            enemies.splice(i, 1);
        }
    }

    // Check for tower range and shoot
    for (var i = 0; i < towers.length; i++) {
        var tower = towers[i];
        var towerPosition = tower.position.clone();
        towerPosition.y = 0.5;

        // Find nearest enemy
        var nearestEnemy = null;
        var nearestDistance = Infinity;
        for (var j = 0; j < enemies.length; j++) {
            var enemy = enemies[j];
            var distance = enemy.position.distanceTo(towerPosition);
            if (distance < nearestDistance) {
                nearestEnemy = enemy;
                nearestDistance = distance;
            }
        }

        // Shoot projectile
        if (nearestEnemy && nearestDistance <= 5) {
            var projectile = new THREE.Mesh(new THREE.SphereGeometry(0.1, 8, 8), new THREE.MeshBasicMaterial({color: 0xff0000}));
projectile.position.set(tower.position.x, tower.position.y + 0.5, tower.position.z);
projectiles.push(projectile);
scene.add(projectile);
        // Remove enemy if hit
        var index = enemies.indexOf(nearestEnemy);
        if (index !== -1) {
            scene.remove(nearestEnemy);
            enemies.splice(index, 1);
        }
    }
}

// Move projectiles
for (var i = 0; i < projectiles.length; i++) {
    var projectile = projectiles[i];
    projectile.position.z -= 0.5;

    // Remove projectile if it hits enemy or end of path
    for (var j = 0; j < enemies.length; j++) {
        var enemy = enemies[j];
        if (projectile.position.distanceTo(enemy.position) <= 0.5) {
            scene.remove(enemy);
            enemies.splice(j, 1);
            scene.remove(projectile);
            projectiles.splice(i, 1);
            break;
        }
    }
    if (projectile.position.z < -10) {
        scene.remove(projectile);
        projectiles.splice(i, 1);
    }
}

// Render scene
renderer.render(scene, camera);

// Update controls
controls.update();

// Update clock
var delta = clock.getDelta();
}

function addTower(x, y, z) {
var tower = new THREE.Mesh(new THREE.BoxGeometry(1, 2, 1), new THREE.MeshBasicMaterial({color: 0xff0000}));
tower.position.set(x, y + 1, z);
towers.push(tower);
scene.add(tower);
}

function addEnemy(x, y, z) {
var enemy = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), new THREE.MeshBasicMaterial({color: 0x0000ff}));
enemy.position.set(x, y + 0.5, z);
enemies.push(enemy);
scene.add(enemy);
}

function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}

function onClick(event) {
// Calculate mouse position
mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;

// Cast ray from camera
raycaster.setFromCamera(mouse, camera);

// Check for tower placement
var intersects = raycaster.intersectObjects([mesh]);
if (intersects.length > 0) {
    var point = intersects[0].point;
    addTower(point.x, point.y, point.z);
}
}