"""
Simple Queue Manager - No RQ dependency
Updated to handle both content and audio jobs
"""
import redis
import json
import uuid
from datetime import datetime

class QueueManager:
    def __init__(self, queue_name='content_audio_queue'):
        self.r = redis.Redis(host='localhost', port=6379, db=0)
        self.queue_name = queue_name
        self.job_prefix = 'job:'
    
    def add_content_job(self, hashid, input_data):
        """Add content creation job to queue"""
        job_id = f"content_{hashid}_{uuid.uuid4().hex[:8]}"
        
        job_data = {
            'job_id': job_id,
            'hashid': hashid,
            'data': input_data,
            'job_type': 'content_creation',  # New field to identify job type
            'status': 'queued',
            'created': datetime.now().isoformat(),
            'queue': self.queue_name
        }
        
        # Store job
        self.r.setex(f"{self.job_prefix}{job_id}", 86400, json.dumps(job_data))
        
        # Add to queue
        self.r.rpush(self.queue_name, job_id)
        
        print(f"✅ Content job queued: {job_id}")
        
        return {
            'job_id': job_id,
            'job_type': 'content_creation',
            'status': 'queued',
            'queue': self.queue_name,
            'queue_size': self.r.llen(self.queue_name)
        }
    
    def add_audio_job(self, hashid, input_data):
        """Add audio creation job to queue"""
        job_id = f"audio_{hashid}_{uuid.uuid4().hex[:8]}"
        
        job_data = {
            'job_id': job_id,
            'hashid': hashid,
            'data': input_data,
            'job_type': 'audio_creation',  # New field to identify job type
            'status': 'queued',
            'created': datetime.now().isoformat(),
            'queue': self.queue_name
        }
        
        # Store job
        self.r.setex(f"{self.job_prefix}{job_id}", 86400, json.dumps(job_data))
        
        # Add to queue
        self.r.rpush(self.queue_name, job_id)
        
        print(f"✅ Audio job queued: {job_id}")
        
        return {
            'job_id': job_id,
            'job_type': 'audio_creation',
            'status': 'queued',
            'queue': self.queue_name,
            'queue_size': self.r.llen(self.queue_name)
        }
    
    def add_content_and_audio_jobs(self, hashid, input_data):
        """
        Add both content and audio jobs to the same queue.
        Content job will be processed first, then audio job.
        """
        # First, add content job
        content_job = self.add_content_job(hashid, input_data)
        
        # Then, add audio job (will be processed after content job)
        audio_job = self.add_audio_job(hashid, input_data)
        
        return {
            'content_job': content_job,
            'audio_job': audio_job,
            'message': 'Both content and audio jobs queued. Content will be created first, then audio.'
        }
    

    def add_job(self, hashid, input_data):
        """
        Legacy method for backward compatibility
        This mimics the old audio_queue_manager behavior
        """
        print("⚠️ Using legacy add_job method - consider updating to new API")
        
        job_id = f"audio_{hashid}_{uuid.uuid4().hex[:8]}"
        
        job_data = {
            'job_id': job_id,
            'hashid': hashid,
            'data': input_data,
            'job_type': 'audio_creation',  # Default to audio for backward compatibility
            'status': 'queued',
            'created': datetime.now().isoformat(),
            'queue': self.queue_name
        }
        
        # Store job
        self.r.setex(f"{self.job_prefix}{job_id}", 86400, json.dumps(job_data))
        
        # Add to queue
        self.r.rpush(self.queue_name, job_id)
        
        print(f"✅ Legacy job queued: {job_id}")
        
        return {
            'job_id': job_id,
            'job_type': 'audio_creation',
            'status': 'queued',
            'queue': self.queue_name,
            'queue_size': self.r.llen(self.queue_name)
        }
    
    
    def get_status(self, job_id):
        """Get job status"""
        job_data = self.r.get(f"{self.job_prefix}{job_id}")
        if not job_data:
            return {'status': 'not_found'}
        
        data = json.loads(job_data)
        
        # Add queue position if still queued
        if data['status'] == 'queued':
            queue_items = self.r.lrange(self.queue_name, 0, -1)
            if queue_items:
                queue_items = [item.decode('utf-8') for item in queue_items]
                if job_id in queue_items:
                    data['queue_position'] = queue_items.index(job_id) + 1
        
        return data
    
    def get_queue_stats(self):
        """Get queue statistics"""
        return {
            'queue_name': self.queue_name,
            'queue_size': self.r.llen(self.queue_name),
            'workers': len([k for k in self.r.keys('worker:*')]),
            'timestamp': datetime.now().isoformat()
        }

# Global instance - using the same queue name for both content and audio
queue_manager = QueueManager(queue_name='content_audio_queue')
audio_queue_manager = queue_manager  # Old name points to new implementation