import redis
from rq import Queue
from rq.job import Job
import json
import uuid
from datetime import datetime
import os

class AudioQueueV2:
    def __init__(self):
        redis_url = os.getenv('REDIS_URL', 'redis://localhost:6379/0')
        self.redis = redis.from_url(redis_url)
        self.queue = Queue('audio_jobs', connection=self.redis)
        
        print("✅ Queue initialized for RQ 2.6.1")
    
    def add_job(self, hashid, input_data):
        """Add job to queue"""
        job_id = f"audio_{hashid}_{uuid.uuid4().hex[:8]}"
        
        job_data = {
            'job_id': job_id,
            'hashid': hashid,
            'data': input_data,
            'status': 'queued',
            'created': datetime.now().isoformat()
        }
        
        # Store in Redis
        self.redis.setex(f"job_info:{job_id}", 86400, json.dumps(job_data))
        
        # Add to RQ queue
        job = self.queue.enqueue(
            'audio_worker_v2.process_job',  # Function name
            job_id, hashid, input_data,     # Arguments
            job_id=job_id,                  # Custom job ID
            job_timeout=1800,               # 30 minute timeout
            result_ttl=86400,               # Keep result 24 hours
            failure_ttl=604800              # Keep failed jobs 7 days
        )
        
        print(f"✅ Job enqueued: {job_id}")
        
        return {
            'job_id': job_id,
            'status': 'queued',
            'queue_position': self.queue.count,
            'estimated_wait': self.queue.count * 5  # 5 minutes per job estimate
        }
    
    def get_status(self, job_id):
        """Get job status"""
        # Get custom info
        job_info = self.redis.get(f"job_info:{job_id}")
        if not job_info:
            return {'status': 'not_found'}
        
        info = json.loads(job_info)
        
        # Get RQ status
        try:
            job = Job.fetch(job_id, connection=self.redis)
            info['rq_status'] = job.get_status()
            
            if job.result:
                info['result'] = job.result
            if job.exc_info:
                info['error'] = job.exc_info
                
        except Exception as e:
            info['rq_error'] = str(e)
        
        return info

audio_queue = AudioQueueV2()