from django.http import JsonResponse, HttpResponseBadRequest
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from django.conf import settings
import json
import logging
from datetime import datetime
from elasticsearch import Elasticsearch

# Initialize logger
logger = logging.getLogger(__name__)

def get_elasticsearch_client():
    return Elasticsearch(f'https://elastic:{settings.ES_PASSWORD}@{settings.ES_URL}', request_timeout=300, retry_on_timeout=True)

@csrf_exempt
@require_http_methods(["POST"])
def livehelpnow_webhook(request):
    try:
        payload = json.loads(request.body.decode('utf-8'))
        payload['@timestamp'] = datetime.utcnow().isoformat()
        payload['processed_at'] = datetime.now().isoformat()
        payload['source'] = 'livehelpnow_webhook'
        
        if not payload.get('event_type'):
            logger.warning("Received payload without event_type")
            return JsonResponse({
                'status': 'error', 
                'message': 'Missing event_type in payload'
            }, status=400)
        
        # Fixed index name - all data goes here
        index_name = "livehelpnow"
        
        es = get_elasticsearch_client()
        response = es.index(index=index_name, body=payload)
        
        logger.info(f"Successfully indexed LiveHelpNow event: {payload.get('event_type')} to {index_name}")
        
        return JsonResponse({
            'status': 'success',
            'indexed': True,
            'index': index_name,
            'document_id': response.get('_id'),
            'result': response.get('result')
        })
        
    except json.JSONDecodeError as e:
        logger.error(f"Invalid JSON in webhook payload: {e}")
        return JsonResponse({
            'status': 'error',
            'message': 'Invalid JSON format'
        }, status=400)
        
    except Exception as e:
        logger.error(f"Error processing LiveHelpNow webhook: {str(e)}")
        return JsonResponse({
            'status': 'error',
            'message': 'Internal server error',
            'details': str(e) if settings.DEBUG else None
        }, status=500)

@csrf_exempt
@require_http_methods(["GET"])
def webhook_health_check(request):
    status = 503
    details = {}
    try:
        es = Elasticsearch(f'https://elastic:{settings.ES_PASSWORD}@{settings.ES_URL}', request_timeout=300, retry_on_timeout=True)

        # Try ping first
        ok = es.ping()
        if ok:
            try:
                info = es.info()
                details = {"cluster": info.get("cluster_name"), "version": info.get("version", {}).get("number")}
            except Exception as e:
                details = {"warning": f"ping ok, info error: {str(e)}"}
            status = 200
        else:
            details = {"error": "ping returned False"}
    except Exception as e:
        details = {"error": str(e)}
    return JsonResponse({"status": "ok" if status == 200 else "unhealthy", "elasticsearch": details}, status=status)
