// Music-themed room name generation system
// Combines musicians, instruments, genres, and descriptors for infinite unique combinations

export const roomNameData = {
    // Famous musicians across genres and eras
    musicians: [
        // Classic Rock
        'Hendrix', 'Bowie', 'Mercury', 'Plant', 'Page', 'Clapton', 'Harrison', 'McCartney', 'Lennon', 'Starr',
        // Hip Hop
        'Biggie', 'Tupac', 'Jay-Z', 'Nas', 'Eminem', 'Kendrick', 'Drake', 'Kanye', 'OutKast', 'Wu-Tang',
        // Electronic
        'Daft', 'Skrillex', 'Deadmau5', 'Aphex', 'Kraftwerk', 'Moby', 'Burial', 'Flying Lotus', 'Four Tet',
        // Pop
        'Madonna', 'Prince', 'Jackson', 'Beyoncé', 'Swift', 'Adele', 'Bruno', 'Weeknd', 'Billie',
        // Jazz
        'Miles', 'Coltrane', 'Parker', 'Armstrong', 'Ellington', 'Monk', 'Brubeck', 'Evans', 'Mingus',
        // Classical
        'Mozart', 'Beethoven', 'Bach', 'Chopin', 'Vivaldi', 'Wagner', 'Tchaikovsky', 'Debussy',
        // Country
        'Cash', 'Nelson', 'Parton', 'Williams', 'Cline', 'Haggard', 'Jennings', 'Strait',
        // Indie/Alternative
        'Radiohead', 'Arcade', 'Strokes', 'Arctic', 'Vampire', 'Tame', 'Fleet', 'Pink Floyd',
        // R&B/Soul
        'Stevie', 'Aretha', 'Marvin', 'Whitney', 'Alicia', 'John Legend', 'D\'Angelo', 'Lauryn'
    ],

    // Musical instruments
    instruments: [
        // String instruments
        'Guitar', 'Piano', 'Violin', 'Cello', 'Bass', 'Harp', 'Banjo', 'Mandolin', 'Ukulele', 'Sitar',
        // Wind instruments
        'Trumpet', 'Saxophone', 'Flute', 'Clarinet', 'Trombone', 'Oboe', 'Harmonica', 'Recorder',
        // Percussion
        'Drums', 'Cymbals', 'Timpani', 'Xylophone', 'Marimba', 'Congas', 'Bongos', 'Tambourine',
        // Electronic
        'Synth', 'Sampler', 'Sequencer', 'Theremin', 'MPC', 'Vocoder', 'Moog', 'Roland',
        // Keyboard
        'Organ', 'Harpsichord', 'Accordion', 'Keytar', 'Rhodes', 'Mellotron',
        // Other
        'Mic', 'Turntable', 'Amp', 'Pedal', 'Mixer', 'Console'
    ],

    // Musical genres
    genres: [
        // Main genres
        'Rock', 'Pop', 'Hip-Hop', 'Jazz', 'Blues', 'Classical', 'Country', 'Electronic', 'R&B', 'Soul',
        // Subgenres
        'Indie', 'Alternative', 'Punk', 'Metal', 'Reggae', 'Folk', 'Funk', 'Disco', 'House', 'Techno',
        'Dubstep', 'Trap', 'Lo-Fi', 'Ambient', 'Trance', 'Drum&Bass', 'Garage', 'Breakbeat',
        'Experimental', 'Post-Rock', 'Shoegaze', 'Grunge', 'Emo', 'Hardcore', 'Progressive',
        // World music
        'Latin', 'Afrobeat', 'Bossa Nova', 'Flamenco', 'Celtic', 'Bollywood', 'K-Pop', 'Reggaeton'
    ],

    // Musical descriptors and terms
    descriptors: [
        // Tempo/Feel
        'Tempo', 'Rhythm', 'Beat', 'Groove', 'Swing', 'Syncopated', 'Upbeat', 'Mellow',
        // Musical elements
        'Melody', 'Harmony', 'Chord', 'Scale', 'Riff', 'Lick', 'Solo', 'Bridge', 'Verse', 'Chorus',
        // Production terms
        'Studio', 'Session', 'Track', 'Mix', 'Master', 'Demo', 'Live', 'Acoustic', 'Unplugged',
        // Venues/Spaces
        'Stage', 'Arena', 'Club', 'Hall', 'Theatre', 'Lounge', 'Bar', 'Festival', 'Concert', 'Jam',
        // Audio terms
        'Reverb', 'Echo', 'Distortion', 'Compression', 'EQ', 'Filter', 'Delay', 'Chorus', 'Flanger',
        // Creative terms
        'Vibe', 'Flow', 'Energy', 'Soul', 'Spirit', 'Pulse', 'Wave', 'Sound', 'Tone', 'Texture'
    ],

    // Connecting words for natural combinations
    connectors: [
        'of', 'in', 'at', 'by', 'with', 'and', 'featuring', 'meets', 'x', '&', 'vs', 'plus'
    ],

    // Room type prefixes for variety
    prefixes: [
        'The', 'Club', 'Studio', 'Hall of', 'House of', 'Temple of', 'Garden of', 'Palace of',
        'Underground', 'Electric', 'Cosmic', 'Digital', 'Vintage', 'Modern', 'Classic', 'Neo',
        'Royal', 'Golden', 'Silver', 'Crystal', 'Neon', 'Velvet', 'Midnight', 'Dawn'
    ]
};

// Room name generation patterns
export const namePatterns = [
    // Pattern 1: [Prefix] [Musician] [Descriptor] 
    // e.g., "The Hendrix Studio", "Club Daft Lounge"
    (data, random) => {
        const prefix = data.prefixes[Math.floor(random() * data.prefixes.length)];
        const musician = data.musicians[Math.floor(random() * data.musicians.length)];
        const descriptor = data.descriptors[Math.floor(random() * data.descriptors.length)];
        return `${prefix} ${musician} ${descriptor}`;
    },

    // Pattern 2: [Instrument] [Genre] [Descriptor]
    // e.g., "Piano Jazz Club", "Guitar Rock Arena"
    (data, random) => {
        const instrument = data.instruments[Math.floor(random() * data.instruments.length)];
        const genre = data.genres[Math.floor(random() * data.genres.length)];
        const descriptor = data.descriptors[Math.floor(random() * data.descriptors.length)];
        return `${instrument} ${genre} ${descriptor}`;
    },

    // Pattern 3: [Prefix] [Genre] [Instrument] [Descriptor]
    // e.g., "The Electronic Synth Laboratory", "Vintage Jazz Piano Hall"
    (data, random) => {
        const prefix = data.prefixes[Math.floor(random() * data.prefixes.length)];
        const genre = data.genres[Math.floor(random() * data.genres.length)];
        const instrument = data.instruments[Math.floor(random() * data.instruments.length)];
        const descriptor = data.descriptors[Math.floor(random() * data.descriptors.length)];
        return `${prefix} ${genre} ${instrument} ${descriptor}`;
    },

    // Pattern 4: [Musician] [Connector] [Instrument]
    // e.g., "Miles meets Trumpet", "Daft x Synth"
    (data, random) => {
        const musician = data.musicians[Math.floor(random() * data.musicians.length)];
        const connector = data.connectors[Math.floor(random() * data.connectors.length)];
        const instrument = data.instruments[Math.floor(random() * data.instruments.length)];
        return `${musician} ${connector} ${instrument}`;
    },

    // Pattern 5: [Genre] [Descriptor] [Venue]
    // e.g., "Hip-Hop Underground Studio", "Jazz Midnight Lounge" 
    (data, random) => {
        const genre = data.genres[Math.floor(random() * data.genres.length)];
        const descriptor = data.descriptors[Math.floor(random() * data.descriptors.length)];
        const venue = ['Studio', 'Lounge', 'Club', 'Hall', 'Arena', 'Stage', 'Bar', 'Theatre'][Math.floor(random() * 8)];
        return `${genre} ${descriptor} ${venue}`;
    },

    // Pattern 6: [Prefix] [Musician] [Connector] [Genre]
    // e.g., "The Beatles of Electronic", "House of Miles featuring Jazz"
    (data, random) => {
        const prefix = data.prefixes[Math.floor(random() * data.prefixes.length)];
        const musician = data.musicians[Math.floor(random() * data.musicians.length)];
        const connector = data.connectors[Math.floor(random() * data.connectors.length)];
        const genre = data.genres[Math.floor(random() * data.genres.length)];
        return `${prefix} ${musician} ${connector} ${genre}`;
    },

    // Pattern 7: Simple [Descriptor] [Instrument]
    // e.g., "Cosmic Guitar", "Velvet Piano"
    (data, random) => {
        const descriptor = data.descriptors[Math.floor(random() * data.descriptors.length)];
        const instrument = data.instruments[Math.floor(random() * data.instruments.length)];
        return `${descriptor} ${instrument}`;
    },

    // Pattern 8: [Musician]'s [Instrument] [Descriptor]
    // e.g., "Hendrix's Guitar Palace", "Miles's Trumpet Temple"
    (data, random) => {
        const musician = data.musicians[Math.floor(random() * data.musicians.length)];
        const instrument = data.instruments[Math.floor(random() * data.instruments.length)];
        const descriptor = data.descriptors[Math.floor(random() * data.descriptors.length)];
        return `${musician}'s ${instrument} ${descriptor}`;
    }
];

// Main room name generation function
export const generateRoomName = (roomX: number, roomY: number, seed?: number) => {
    // Create seeded random function
    const seededRandom = (seed) => {
        let x = Math.sin(seed) * 10000;
        return x - Math.floor(x);
    };

    // Create room-specific seed
    const roomSeed = seed || (roomX * 1000 + roomY * 100 + 42);
    let currentSeed = roomSeed;
    
    const random = () => {
        currentSeed += 1;
        return seededRandom(currentSeed);
    };

    // Select pattern based on coordinates (ensures consistency)
    const patternIndex = Math.floor(random() * namePatterns.length);
    const pattern = namePatterns[patternIndex];

    // Generate name using selected pattern
    return pattern(roomNameData, random);
};

// Export for testing and utilities
export const getRoomNameInfo = (roomX, roomY) => {
    const roomSeed = roomX * 1000 + roomY * 100 + 42;
    const roomName = generateRoomName(roomX, roomY, roomSeed);
    
    return {
        coordinates: { x: roomX, y: roomY },
        seed: roomSeed,
        name: roomName,
        id: `room_${roomX}_${roomY}`
    };
};