from flask import Flask, request, jsonify
from flask_cors import CORS
import boto3
from botocore.client import Config
from botocore.exceptions import ClientError
import os

app = Flask(__name__)
CORS(app)  # Habilita CORS para todas as rotas

# Configurações do Hetzner Object Storage
ACCESS_KEY = '240QU5FWQXD35Q1PDRI7'
SECRET_KEY = '1l1ip1GAg8MK8CTCvDsGjekVmauVy3dYbrKPE9Nq'
ENDPOINT = 'https://fsn1.your-objectstorage.com'
BUCKET_NAME = 'batalhaodecristo'

# Configurar cliente S3
s3_client = boto3.client(
    's3',
    endpoint_url=ENDPOINT,
    aws_access_key_id=ACCESS_KEY,
    aws_secret_access_key=SECRET_KEY,
    config=Config(signature_version='s3v4')
)

@app.route('/upload', methods=['POST'])
def upload_file():
    """
    Endpoint de upload via POST
    
    Parâmetros:
    - file: arquivo (obrigatório)
    - filename: nome customizado (opcional)
    - folder: pasta de destino (opcional)
    
    Retorna JSON com URL do arquivo
    """
    try:
        # Verificar se arquivo foi enviado
        if 'file' not in request.files:
            return jsonify({
                'success': False,
                'error': 'Nenhum arquivo enviado. Use o campo "file".'
            }), 400
        
        file = request.files['file']
        
        # Verificar se arquivo tem nome
        if file.filename == '':
            return jsonify({
                'success': False,
                'error': 'Nome do arquivo vazio'
            }), 400
        
        # Nome do arquivo (usar custom ou original)
        filename = request.form.get('filename', file.filename)
        
        # Adicionar pasta se fornecida
        folder = request.form.get('folder', '')
        if folder:
            folder = folder.strip('/')
            filename = f"{folder}/{filename}"
        
        # Fazer upload
        s3_client.upload_fileobj(
            file,
            BUCKET_NAME,
            filename,
            ExtraArgs={'ContentType': file.content_type or 'application/octet-stream'}
        )
        
        # Gerar URL
        url = f"{ENDPOINT}/{BUCKET_NAME}/{filename}"
        
        # Retornar sucesso
        return jsonify({
            'success': True,
            'url': url,
            'filename': filename,
            'contentType': file.content_type or 'application/octet-stream'
        }), 200
        
    except ClientError as e:
        return jsonify({
            'success': False,
            'error': 'Erro no S3',
            'details': str(e)
        }), 500
        
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500


@app.route('/health', methods=['GET'])
def health_check():
    """Endpoint para verificar se a API está funcionando"""
    return jsonify({
        'status': 'online',
        'service': 'Hetzner Upload API',
        'bucket': BUCKET_NAME
    }), 200


@app.route('/', methods=['GET'])
def index():
    """Documentação da API"""
    return jsonify({
        'message': 'API de Upload - Hetzner Object Storage',
        'endpoints': {
            'POST /upload': {
                'description': 'Fazer upload de arquivo',
                'params': {
                    'file': 'Arquivo (obrigatório)',
                    'filename': 'Nome customizado (opcional)',
                    'folder': 'Pasta de destino (opcional)'
                },
                'example': 'curl -X POST http://api.batalhaodecristo.com/upload -F "file=@imagem.jpg"'
            },
            'GET /health': {
                'description': 'Verificar status da API'
            }
        }
    }), 200


if __name__ == '__main__':
    print("=" * 60)
    print("🚀 API de Upload Hetzner iniciada!")
    print("📍 Endpoint: http://localhost:5000/upload")
    print("📖 Docs: http://localhost:5000/")
    print("=" * 60)
    app.run(debug=True, host='0.0.0.0', port=5000)