"""File handling routes - upload, download, delete"""
from flask import Blueprint, request, jsonify, send_from_directory, current_app
from flask_login import login_required, current_user
from pathlib import Path

from ..services.file_storage_service import storage_service
from ..models.file_upload import FileUpload, FileCategory

files_bp = Blueprint('files', __name__, url_prefix='/files')


@files_bp.route('/upload', methods=['POST'])
@login_required
def upload_file():
    """Upload a file"""
    try:
        if 'file' not in request.files:
            return jsonify({'error': 'No file provided'}), 400
        
        file = request.files['file']
        if file.filename == '':
            return jsonify({'error': 'No file selected'}), 400
        
        # Get optional parameters
        category_str = request.form.get('category', 'OTHER')
        try:
            category = FileCategory[category_str.upper()]
        except KeyError:
            category = FileCategory.OTHER
        
        message_id = request.form.get('message_id')
        job_id = request.form.get('job_id')
        contract_id = request.form.get('contract_id')
        
        # Upload file
        file_record = storage_service.upload_file(
            file=file,
            user_id=current_user.id,
            category=category,
            message_id=int(message_id) if message_id else None,
            job_id=int(job_id) if job_id else None,
            contract_id=int(contract_id) if contract_id else None
        )
        
        return jsonify({
            'file': {
                'id': file_record.id,
                'filename': file_record.filename,
                'original_filename': file_record.original_filename,
                'url': file_record.public_url,
                'file_type': file_record.file_type,
                'file_size': file_record.file_size,
                'file_size_mb': file_record.file_size_mb,
                'is_image': file_record.is_image,
                'category': file_record.category.value,
                'created_at': file_record.created_at.isoformat()
            }
        }), 200
        
    except ValueError as e:
        return jsonify({'error': str(e)}), 400
    except Exception as e:
        current_app.logger.error(f"File upload error: {e}")
        return jsonify({'error': 'Upload failed'}), 500


@files_bp.route('/delete/<int:file_id>', methods=['DELETE'])
@login_required
def delete_file(file_id):
    """Delete a file"""
    try:
        file_record = FileUpload.query.get_or_404(file_id)
        
        if file_record.user_id != current_user.id:
            return jsonify({'error': 'Unauthorized'}), 403
        
        storage_service.delete_file(file_id)
        return jsonify({'message': 'File deleted'}), 200
        
    except Exception as e:
        current_app.logger.error(f"File deletion error: {e}")
        return jsonify({'error': 'Deletion failed'}), 500


@files_bp.route('/<category>/<filename>')
def serve_file(category, filename):
    """Serve uploaded file (local storage only)"""
    try:
        upload_folder = current_app.config.get('UPLOAD_FOLDER')
        category_folder = Path(upload_folder) / category
        return send_from_directory(category_folder, filename, as_attachment=False)
    except Exception as e:
        current_app.logger.error(f"File serve error: {e}")
        return jsonify({'error': 'File not found'}), 404


@files_bp.route('/info/<int:file_id>', methods=['GET'])
@login_required
def file_info(file_id):
    """Get file information"""
    try:
        file_record = FileUpload.query.get_or_404(file_id)
        
        if file_record.user_id != current_user.id:
            return jsonify({'error': 'Unauthorized'}), 403
        
        return jsonify({
            'id': file_record.id,
            'filename': file_record.filename,
            'original_filename': file_record.original_filename,
            'url': file_record.public_url,
            'file_type': file_record.file_type,
            'file_size': file_record.file_size,
            'file_size_mb': file_record.file_size_mb,
            'is_image': file_record.is_image,
            'category': file_record.category.value,
            'storage_backend': file_record.storage_backend.value,
            'width': file_record.width,
            'height': file_record.height,
            'created_at': file_record.created_at.isoformat()
        }), 200
        
    except Exception as e:
        current_app.logger.error(f"File info error: {e}")
        return jsonify({'error': 'Failed to get file info'}), 500


@files_bp.route('/list', methods=['GET'])
@login_required
def list_files():
    """List user's uploaded files"""
    try:
        category = request.args.get('category')
        page = request.args.get('page', 1, type=int)
        per_page = request.args.get('per_page', 20, type=int)
        
        # Build query
        query = FileUpload.query.filter_by(
            user_id=current_user.id,
            is_deleted=False
        )
        
        if category:
            try:
                category_enum = FileCategory[category.upper()]
                query = query.filter_by(category=category_enum)
            except KeyError:
                pass
        
        # Paginate
        pagination = query.order_by(FileUpload.created_at.desc()).paginate(
            page=page,
            per_page=per_page,
            error_out=False
        )
        
        files = [{
            'id': f.id,
            'filename': f.filename,
            'original_filename': f.original_filename,
            'url': f.public_url,
            'file_type': f.file_type,
            'file_size_mb': f.file_size_mb,
            'is_image': f.is_image,
            'category': f.category.value,
            'created_at': f.created_at.isoformat()
        } for f in pagination.items]
        
        return jsonify({
            'files': files,
            'total': pagination.total,
            'pages': pagination.pages,
            'current_page': page,
            'per_page': per_page
        }), 200
        
    except Exception as e:
        current_app.logger.error(f"File list error: {e}")
        return jsonify({'error': 'Failed to list files'}), 500
