from sqlalchemy.orm import Session
from fastapi import HTTPException, status
from typing import Dict, Any

from app.repositories import order_repo, content_repo
from app.schemas.order_schemas import CartItemCreate, CartItemUpdate, OrderCreate, OrderUpdate
from app.schemas.content_schemas import AnalyticsLogCreate


# Сервисы корзины и заказов
def add_to_cart(db: Session, user_id: int, cart_item: CartItemCreate) -> Dict[str, Any]:
    from app.schemas.order_schemas import CartItem as CartItemSchema
    
    new_cart_item = order_repo.create_cart_item(db, cart_item, user_id)
    
    # Логируем событие добавления в корзину
    log_data = AnalyticsLogCreate(
        user_id=user_id,
        event_type="add_to_cart",
        product_id=new_cart_item.variant.product_id,
        additional_data={"quantity": cart_item.quantity}
    )
    content_repo.log_analytics_event(db, log_data)
    
    # Преобразуем объект SQLAlchemy в схему Pydantic
    cart_item_schema = CartItemSchema.model_validate(new_cart_item)
    return {"cart_item": cart_item_schema}


def update_cart_item(db: Session, user_id: int, cart_item_id: int, cart_item: CartItemUpdate) -> Dict[str, Any]:
    from app.schemas.order_schemas import CartItem as CartItemSchema
    
    updated_cart_item = order_repo.update_cart_item(db, cart_item_id, cart_item, user_id)
    # Преобразуем объект SQLAlchemy в схему Pydantic
    cart_item_schema = CartItemSchema.model_validate(updated_cart_item)
    return {"cart_item": cart_item_schema}


def remove_from_cart(db: Session, user_id: int, cart_item_id: int) -> Dict[str, Any]:
    success = order_repo.delete_cart_item(db, cart_item_id, user_id)
    return {"success": success}


def clear_cart(db: Session, user_id: int) -> Dict[str, Any]:
    success = order_repo.clear_cart(db, user_id)
    return {"success": success}


def get_cart(db: Session, user_id: int) -> Dict[str, Any]:
    from app.schemas.order_schemas import CartItem as CartItemSchema
    
    # Получаем элементы корзины с деталями продуктов
    cart_items = order_repo.get_cart_with_product_details(db, user_id)
    
    # Рассчитываем общую сумму корзины
    total_amount = sum(item["total_price"] for item in cart_items)
    
    # Примечание: cart_items уже содержит сериализованные данные из репозитория
    return {
        "items": cart_items,
        "total_amount": total_amount,
        "items_count": len(cart_items)
    }


def create_order(db: Session, user_id: int, order: OrderCreate) -> Dict[str, Any]:
    from app.schemas.order_schemas import Order as OrderSchema
    
    new_order = order_repo.create_order(db, order, user_id)
    
    # Логируем событие создания заказа
    log_data = AnalyticsLogCreate(
        user_id=user_id,
        event_type="order_created",
        additional_data={"order_id": new_order.id, "total_amount": new_order.total_amount}
    )
    content_repo.log_analytics_event(db, log_data)
    
    # Преобразуем объект SQLAlchemy в схему Pydantic
    order_schema = OrderSchema.model_validate(new_order)
    return {"order": order_schema}


def get_order(db: Session, user_id: int, order_id: int, is_admin: bool = False) -> Dict[str, Any]:
    # Получаем заказ с деталями
    order_details = order_repo.get_order_with_details(db, order_id)
    
    # Проверяем права доступа
    if not is_admin and order_details["user_id"] != user_id:
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail="Недостаточно прав для просмотра этого заказа"
        )
    
    return {"order": order_details}


def update_order(db: Session, user_id: int, order_id: int, order: OrderUpdate, is_admin: bool = False) -> Dict[str, Any]:
    from app.schemas.order_schemas import Order as OrderSchema
    
    updated_order = order_repo.update_order(db, order_id, order, is_admin)
    
    # Проверяем права доступа
    if not is_admin and updated_order.user_id != user_id:
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail="Недостаточно прав для обновления этого заказа"
        )
    
    # Преобразуем объект SQLAlchemy в схему Pydantic
    order_schema = OrderSchema.model_validate(updated_order)
    return {"order": order_schema}


def cancel_order(db: Session, user_id: int, order_id: int) -> Dict[str, Any]:
    from app.schemas.order_schemas import Order as OrderSchema
    
    # Отменяем заказ (обычный пользователь может только отменить заказ)
    order_update = OrderUpdate(status="cancelled")
    updated_order = order_repo.update_order(db, order_id, order_update, is_admin=False)
    
    # Проверяем права доступа
    if updated_order.user_id != user_id:
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail="Недостаточно прав для отмены этого заказа"
        )
    
    # Преобразуем объект SQLAlchemy в схему Pydantic
    order_schema = OrderSchema.model_validate(updated_order)
    return {"order": order_schema} 