#!/usr/bin/env python
"""
Fix Media Files Serving in Production - Simple Version
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("\nChecking 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("\nTesting 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("\nUpdating .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("\nCreating 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)
        
        html_content = 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>
"""
        return HttpResponse(html_content)
    else:
        html_content = 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>
"""
        return HttpResponse(html_content)
'''
    
    # 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("\nNext 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("\nTroubleshooting:")
    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() 