#!/usr/bin/env python
"""
Fix Media Files Serving in Production
This script addresses common issues with media files not displaying on the website
"""

import os
import sys
import django
from pathlib import Path

# Setup Django environment
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'branch_system.settings_production')
django.setup()

from django.conf import settings
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile

def check_media_directory():
    """Check and fix media directory structure"""
    print("🔍 Checking media directory structure...")
    
    media_root = Path(settings.MEDIA_ROOT)
    if not media_root.exists():
        print(f"❌ Media directory does not exist: {media_root}")
        media_root.mkdir(parents=True, exist_ok=True)
        print(f"✅ Created media directory: {media_root}")
    else:
        print(f"✅ Media directory exists: {media_root}")
    
    # Check subdirectories
    subdirs = ['kyc', 'kyc/bank_statements', 'kyc/id_documents', 'kyc/selfies', 'kyc/utility_bills', 'documents']
    for subdir in subdirs:
        subdir_path = media_root / subdir
        if not subdir_path.exists():
            subdir_path.mkdir(parents=True, exist_ok=True)
            print(f"✅ Created subdirectory: {subdir_path}")
    
    return True

def check_file_permissions():
    """Check and fix file permissions"""
    print("\n🔍 Checking file permissions...")
    
    media_root = Path(settings.MEDIA_ROOT)
    
    # Set permissions for media directory
    try:
        os.chmod(media_root, 0o755)
        print(f"✅ Set permissions for media directory: {media_root}")
        
        # Set permissions for all subdirectories
        for root, dirs, files in os.walk(media_root):
            for dir_name in dirs:
                dir_path = Path(root) / dir_name
                os.chmod(dir_path, 0o755)
            
            for file_name in files:
                file_path = Path(root) / file_name
                os.chmod(file_path, 0o644)
        
        print("✅ Set permissions for all media files and directories")
        
    except Exception as e:
        print(f"⚠️ Warning: Could not set permissions: {e}")
    
    return True

def test_media_file_access():
    """Test if media files can be accessed"""
    print("\n🔍 Testing media file access...")
    
    # Create a test file
    test_content = b"Test media file access"
    test_file_path = "test_media_access.txt"
    
    try:
        # Save test file
        saved_path = default_storage.save(test_file_path, ContentFile(test_content))
        print(f"✅ Created test file: {saved_path}")
        
        # Try to read the file
        if default_storage.exists(saved_path):
            with default_storage.open(saved_path, 'rb') as f:
                content = f.read()
                if content == test_content:
                    print("✅ Media file access test passed")
                else:
                    print("❌ Media file access test failed - content mismatch")
            # Clean up test file
            default_storage.delete(saved_path)
        else:
            print("❌ Media file access test failed - file not found")
            
    except Exception as e:
        print(f"❌ Media file access test failed: {e}")
    
    return True

def update_htaccess_for_media():
    """Update .htaccess file to better handle media files"""
    print("\n🔧 Updating .htaccess for media files...")
    
    htaccess_content = """# Django .htaccess file for cPanel
# This file configures Apache to work with your Django application

# Enable rewrite engine
RewriteEngine On

# Handle static files
RewriteCond %{REQUEST_URI} ^/static/
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^static/(.*)$ /staticfiles/$1 [L]

# Handle media files - serve directly if file exists
RewriteCond %{REQUEST_URI} ^/media/
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^media/(.*)$ media/$1 [L]

# Handle media files - fallback to Django if file doesn't exist
RewriteCond %{REQUEST_URI} ^/media/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^media/(.*)$ /passenger_wsgi.py/media/$1 [QSA,L]

# Redirect all other requests to Django
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /passenger_wsgi.py/$1 [QSA,L]

# Security headers
<IfModule mod_headers.c>
    Header always set X-Content-Type-Options nosniff
    Header always set X-Frame-Options DENY
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>

# Compression
<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE application/xhtml+xml
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/x-javascript
</IfModule>

# Cache static files
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
    ExpiresByType image/png "access plus 1 month"
    ExpiresByType image/jpg "access plus 1 month"
    ExpiresByType image/jpeg "access plus 1 month"
    ExpiresByType image/gif "access plus 1 month"
    ExpiresByType image/ico "access plus 1 month"
    ExpiresByType image/icon "access plus 1 month"
    ExpiresByType text/plain "access plus 1 month"
    ExpiresByType application/pdf "access plus 1 month"
</IfModule>
"""
    
    try:
        with open('.htaccess', 'w') as f:
            f.write(htaccess_content)
        print("✅ Updated .htaccess file with improved media handling")
    except Exception as e:
        print(f"❌ Failed to update .htaccess: {e}")
    
    return True

def create_media_test_view():
    """Create a test view to verify media file serving"""
    print("\n🔧 Creating media test view...")
    
    test_view_content = '''
from django.http import HttpResponse
from django.conf import settings
import os

def test_media_access(request):
    """Test view to verify media file access"""
    media_root = settings.MEDIA_ROOT
    test_file = os.path.join(media_root, 'test.txt')
    
    # Create a test file
    with open(test_file, 'w') as f:
        f.write('Media test file')
    
    # Check if file exists
    if os.path.exists(test_file):
        with open(test_file, 'r') as f:
            content = f.read()
        
        # Clean up
        os.remove(test_file)
        
        return HttpResponse(f'''
<html>
<head><title>Media Test</title></head>
<body>
    <h1>Media File Test</h1>
    <p>Media root: {media_root}</p>
    <p>Test file content: {content}</p>
    <p>Status: SUCCESS - Media files are working</p>
</body>
</html>
''')
    else:
        return HttpResponse(f'''
<html>
<head><title>Media Test</title></head>
<body>
    <h1>Media File Test</h1>
    <p>Media root: {media_root}</p>
    <p>Status: FAILED - Media files are not working</p>
</body>
</html>
''')
'''
    
    # Add the test view to utils/views.py
    utils_views_path = 'utils/views.py'
    if os.path.exists(utils_views_path):
        with open(utils_views_path, 'r') as f:
            content = f.read()
        
        if 'def test_media_access' not in content:
            # Add the test view at the end of the file
            with open(utils_views_path, 'a') as f:
                f.write(test_view_content)
            print("✅ Added media test view to utils/views.py")
        else:
            print("✅ Media test view already exists")
    else:
        print("❌ utils/views.py not found")

def main():
    """Main function to fix media file issues"""
    print("🔧 Fixing Media Files in Production")
    print("=" * 50)
    
    # Step 1: Check media directory
    check_media_directory()
    
    # Step 2: Check file permissions
    check_file_permissions()
    
    # Step 3: Test media file access
    test_media_file_access()
    
    # Step 4: Update .htaccess
    update_htaccess_for_media()
    
    # Step 5: Create test view
    create_media_test_view()
    
    print("\n" + "=" * 50)
    print("✅ Media file fix completed!")
    print("\n📋 Next Steps:")
    print("1. Restart your web server")
    print("2. Test media access at: https://ruralpoint.co.ke/utils/test-media/")
    print("3. Check if client files are now displaying")
    print("4. If issues persist, check cPanel error logs")
    
    print("\n🔍 Troubleshooting:")
    print("- If files still don't display, check cPanel file permissions")
    print("- Ensure media directory is in the correct location")
    print("- Verify .htaccess is being read by Apache")
    print("- Check if SELinux or similar security is blocking access")

if __name__ == "__main__":
    main() 