#!/usr/bin/env python3
"""
Instagram Downloader API - cPanel Compatible Version
Optimized for shared hosting and cPanel deployment
"""

import os
import sys
import json
import threading
import time
from datetime import datetime
from flask import Flask, request, jsonify, render_template, send_file

# Add current directory to path for imports
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

try:
    from enhanced_instagram_downloader import InstagramDownloader
    downloader_available = True
except ImportError:
    print("⚠️ Warning: enhanced_instagram_downloader.py not found!")
    downloader_available = False

app = Flask(__name__)

# Initialize downloader with error handling
if downloader_available:
    try:
        downloader = InstagramDownloader()
        print("✅ Instagram Downloader initialized successfully")
    except Exception as e:
        print(f"❌ Error initializing downloader: {e}")
        downloader = None
else:
    downloader = None

# Global variables for tracking
download_status = {
    'is_downloading': False,
    'progress': 'Ready to download',
    'current_url': '',
    'total_urls': 0,
    'completed_urls': 0,
    'downloads': []
}

@app.route('/')
def index():
    """Main API interface page"""
    return render_template('api_interface_final.html')

@app.route('/api/download', methods=['POST'])
def download_content():
    """Download Instagram content via API"""
    global download_status
    
    try:
        # Check if downloader is available
        if not downloader:
            return jsonify({'error': 'Downloader not available. Please check server configuration.'}), 500
        
        data = request.get_json()
        
        if not data:
            return jsonify({'error': 'No data provided'}), 400
        
        urls = data.get('urls', [])
        content_type = data.get('content_type', 'auto')
        quality = data.get('quality', 'best')
        output_dir = data.get('output_dir', None)
        
        # Validate inputs
        if not urls or not isinstance(urls, list):
            return jsonify({'error': 'Invalid URLs provided'}), 400
        
        if not isinstance(urls, list) or len(urls) == 0:
            return jsonify({'error': 'No URLs provided'}), 400
        
        # Validate content type
        valid_content_types = ['auto', 'reel', 'post']
        if content_type not in valid_content_types:
            return jsonify({'error': 'Invalid content type'}), 400
        
        # Validate quality
        valid_qualities = ['best', 'medium', 'low']
        if quality not in valid_qualities:
            return jsonify({'error': 'Invalid quality setting'}), 400
        
        if download_status['is_downloading']:
            return jsonify({'error': 'Download already in progress'}), 409
        
        # Start download in background thread
        thread = threading.Thread(target=download_multiple_content, 
                                args=(urls, content_type, quality, output_dir))
        thread.daemon = True
        thread.start()
        
        return jsonify({
            'message': 'Download started',
            'status': 'started',
            'urls_count': len(urls)
        })
        
    except Exception as e:
        return jsonify({'error': f'Server error: {str(e)}'}), 500

@app.route('/api/status')
def get_status():
    """Get current download status"""
    return jsonify(download_status)

@app.route('/api/downloads')
def get_downloads():
    """Get list of completed downloads"""
    return jsonify(download_status['downloads'])

@app.route('/api/clear', methods=['POST'])
def clear_downloads():
    """Clear download history"""
    global download_status
    download_status['downloads'] = []
    download_status['progress'] = 'Ready to download'
    download_status['completed_urls'] = 0
    return jsonify({'message': 'Download history cleared'})

def download_multiple_content(urls, content_type='auto', quality='best', output_dir=None):
    """Download multiple content items"""
    global download_status
    
    download_status['is_downloading'] = True
    download_status['total_urls'] = len(urls)
    download_status['completed_urls'] = 0
    download_status['downloads'] = []
    
    try:
        for i, url in enumerate(urls):
            download_status['current_url'] = url
            download_status['progress'] = f'Downloading {i+1}/{len(urls)}: {url}'
            
            try:
                if not downloader:
                    raise Exception("Downloader not available")
                
                result = downloader.download_content(
                    url=url,
                    content_type=content_type,
                    quality=quality,
                    output_dir=output_dir
                )
                
                if result and result.get('success'):
                    download_status['downloads'].append({
                        'url': url,
                        'title': result.get('title', 'Unknown'),
                        'type': result.get('type', 'Unknown'),
                        'duration': result.get('duration', 'N/A'),
                        'uploader': result.get('uploader', 'N/A'),
                        'view_count': result.get('view_count', 'N/A'),
                        'like_count': result.get('like_count', 'N/A'),
                        'timestamp': datetime.now().isoformat(),
                        'status': 'success'
                    })
                else:
                    error_msg = result.get('error', 'Unknown error') if result else 'Download failed'
                    download_status['downloads'].append({
                        'url': url,
                        'error': error_msg,
                        'timestamp': datetime.now().isoformat(),
                        'status': 'error'
                    })
                
            except Exception as e:
                download_status['downloads'].append({
                    'url': url,
                    'error': str(e),
                    'timestamp': datetime.now().isoformat(),
                    'status': 'error'
                })
            
            download_status['completed_urls'] = i + 1
        
        download_status['progress'] = f'Completed {len(urls)} downloads'
        
    except Exception as e:
        download_status['progress'] = f'Error: {str(e)}'
    
    finally:
        download_status['is_downloading'] = False
        download_status['current_url'] = ''

@app.route('/api/test')
def test_api():
    """Test API endpoint"""
    return jsonify({
        'status': 'API is working',
        'timestamp': datetime.now().isoformat(),
        'version': '1.0.0',
        'downloader_available': downloader_available,
        'server': 'cPanel Hosting'
    })

@app.route('/api/health')
def health_check():
    """Health check endpoint for cPanel monitoring"""
    return jsonify({
        'status': 'healthy',
        'timestamp': datetime.now().isoformat(),
        'downloader_available': downloader_available,
        'is_downloading': download_status['is_downloading']
    })

# Error handlers
@app.errorhandler(404)
def not_found(error):
    return jsonify({'error': 'Endpoint not found'}), 404

@app.errorhandler(500)
def internal_error(error):
    return jsonify({'error': 'Internal server error'}), 500

if __name__ == '__main__':
    print("🚀 Starting Instagram Downloader API for cPanel...")
    print("📱 API Interface: https://insta.siddharthnahar.in/")
    print("🔗 API Endpoints:")
    print("   POST /api/download - Download content")
    print("   GET  /api/status - Get download status")
    print("   GET  /api/downloads - Get download history")
    print("   POST /api/clear - Clear download history")
    print("   GET  /api/test - Test API")
    print("   GET  /api/health - Health check")
    print("\n✨ cPanel API is ready!")
    
    # cPanel configuration
    port = int(os.environ.get('PORT', 5000))
    debug = os.environ.get('DEBUG', 'False').lower() == 'true'
    
    app.run(debug=debug, host='0.0.0.0', port=port)
