#ifndef SINE_LUT_H
#define SINE_LUT_H

#include <Arduino.h>
#include <FastLED.h>

// Sine wave lookup table for x=0 to 9, y amplitude 0 to 9
const uint8_t sineWaveLUT[10] PROGMEM = {
  0,  // x=0
  3,  // x=1
  6,  // x=2
  8,  // x=3
  9,  // x=4
  9,  // x=5
  8,  // x=6
  6,   // x=7
  3,  // x=8
  0   // x=9
};

// Get sine wave Y value for given X position
inline uint8_t getSineY(uint8_t x) {
  return pgm_read_byte(&sineWaveLUT[x % 10]);
}

// Traveling wave lookup table - CORRECTED
// Format: [step][x][z] = y value
// 10 steps (animation frames), 5 x positions (0-3), 5 z positions (0-3)
// Data is mirrored to create full 8x8 cube
const uint8_t travelingWaveLUT[10][5][5] PROGMEM = {
  // Step 0
  {
    {9, 8, 7, 6, 5},  // x=0, z=0-4
    {8, 8, 7, 5, 4},  // x=1, z=0-4
    {7, 7, 5, 4, 3},  // x=2, z=0-4
    {6, 5, 4, 2, 1},  // x=3, z=0-4
    {5, 4, 3, 1, 0}   // x=4, z=0-4
  },
  
  // Step 1
  {
    {9, 8, 7, 6, 5},  // x=0, z=0-4
    {8, 8, 7, 5, 4},  // x=1, z=0-4
    {7, 7, 5, 4, 3},  // x=2, z=0-4
    {6, 5, 4, 2, 1},  // x=3, z=0-4
    {5, 4, 3, 1, 0}   // x=4, z=0-4
  },
  
  // Step 2
  {
    {8, 8, 7, 5, 5},  // x=0, z=0-4
    {8, 7, 6, 5, 4},  // x=1, z=0-4
    {7, 6, 5, 4, 3},  // x=2, z=0-4
    {5, 5, 4, 3, 2},  // x=3, z=0-4
    {5, 4, 3, 2, 1}   // x=4, z=0-4
  },
  
  // Step 3
  {
    {7, 7, 6, 5, 5},  // x=0, z=0-4
    {7, 7, 6, 5, 4},  // x=1, z=0-4
    {6, 6, 5, 4, 3},  // x=2, z=0-4
    {5, 5, 4, 3, 3},  // x=3, z=0-4
    {5, 4, 3, 3, 2}   // x=4, z=0-4
  },
  
  // Step 4
  {
    {6, 6, 5, 5, 5},  // x=0, z=0-4
    {6, 6, 5, 5, 4},  // x=1, z=0-4
    {5, 5, 5, 4, 4},  // x=2, z=0-4
    {5, 5, 4, 4, 3},  // x=3, z=0-4
    {5, 4, 4, 3, 3}   // x=4, z=0-4
  },
  
  // Step 5
  {
    {5, 5, 5, 5, 5},  // x=0, z=0-4
    {5, 5, 5, 5, 5},  // x=1, z=0-4
    {5, 5, 5, 5, 5},  // x=2, z=0-4
    {5, 5, 5, 5, 5},  // x=3, z=0-4
    {5, 5, 5, 5, 5}   // x=4, z=0-4
  },
  
  // Step 6
  {
    {3, 3, 4, 4, 4},  // x=0, z=0-4
    {3, 3, 4, 4, 5},  // x=1, z=0-4
    {4, 4, 4, 5, 5},  // x=2, z=0-4
    {4, 4, 5, 5, 6},  // x=3, z=0-4
    {4, 5, 5, 6, 6}   // x=4, z=0-4
  },
  
  // Step 7
  {
    {2, 2, 3, 4, 4},  // x=0, z=0-4
    {2, 2, 3, 4, 5},  // x=1, z=0-4
    {3, 3, 4, 5, 6},  // x=2, z=0-4
    {4, 4, 5, 6, 6},  // x=3, z=0-4
    {4, 5, 6, 6, 7}   // x=4, z=0-4
  },
  
  // Step 8
  {
    {1, 1, 2, 4, 4},  // x=0, z=0-4
    {1, 2, 3, 4, 5},  // x=1, z=0-4
    {2, 3, 4, 5, 6},  // x=2, z=0-4
    {4, 4, 5, 6, 7},  // x=3, z=0-4
    {4, 5, 6, 7, 8}   // x=4, z=0-4
  },
  
  // Step 9
  {
    {0, 1, 2, 3, 4},  // x=0, z=0-4
    {1, 1, 2, 4, 5},  // x=1, z=0-4
    {2, 2, 4, 5, 6},  // x=2, z=0-4
    {3, 4, 5, 7, 8},  // x=3, z=0-4
    {4, 5, 6, 8, 9}   // x=4, z=0-4
  }
};

// Get Y value from lookup table
inline uint8_t getTravelingWaveY(uint8_t step, uint8_t x, uint8_t z) {
  if(step > 9) {
    step = 19 - step; // Reverse direction after 10 steps
  }
  return pgm_read_byte(&travelingWaveLUT[step % 10][x % 5][z % 5]);
}

#endif // SINE_LUT_H