from sqlalchemy.orm import Session
from fastapi import HTTPException, status
from typing import List, Optional
from . import repository
from .schema import PlatformsettingCreate, PlatformsettingUpdate, PlatformsettingResponse


def create_platformsetting(db: Session, data: PlatformsettingCreate) -> PlatformsettingResponse:
    existing = repository.get_by_key(db, data.setting_key)
    if existing:
        raise HTTPException(
            status_code=status.HTTP_409_CONFLICT,
            detail=f"Platform setting with key '{data.setting_key}' already exists"
        )
    
    try:
        setting = repository.create(db, data.model_dump())
        db.commit()
        db.refresh(setting)
        return PlatformsettingResponse.model_validate(setting)
    except Exception:
        db.rollback()
        raise


def get_platformsetting(db: Session, setting_id: str) -> PlatformsettingResponse:
    setting = repository.get_by_id(db, setting_id)
    if not setting:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=f"Platform setting with ID '{setting_id}' not found"
        )
    return PlatformsettingResponse.model_validate(setting)


def get_platformsetting_by_key(db: Session, setting_key: str) -> PlatformsettingResponse:
    setting = repository.get_by_key(db, setting_key)
    if not setting:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=f"Platform setting with key '{setting_key}' not found"
        )
    return PlatformsettingResponse.model_validate(setting)


def list_platformsettings(
    db: Session,
    limit: int,
    offset: int,
    setting_type: Optional[str] = None,
    search: Optional[str] = None
) -> List[PlatformsettingResponse]:
    filters = {}
    if setting_type:
        filters["setting_type"] = setting_type
    if search:
        filters["search"] = search
    
    settings = repository.list_all(db, limit, offset, **filters)
    return [PlatformsettingResponse.model_validate(s) for s in settings]


def update_platformsetting(
    db: Session,
    setting_id: str,
    data: PlatformsettingUpdate
) -> PlatformsettingResponse:
    setting = repository.get_by_id(db, setting_id)
    if not setting:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=f"Platform setting with ID '{setting_id}' not found"
        )
    
    update_data = data.model_dump(exclude_unset=True)
    
    if "setting_key" in update_data and update_data["setting_key"] != setting.setting_key:
        existing = repository.get_by_key(db, update_data["setting_key"])
        if existing:
            raise HTTPException(
                status_code=status.HTTP_409_CONFLICT,
                detail=f"Platform setting with key '{update_data['setting_key']}' already exists"
            )
    
    try:
        updated_setting = repository.update(db, setting_id, update_data)
        db.commit()
        db.refresh(updated_setting)
        return PlatformsettingResponse.model_validate(updated_setting)
    except Exception:
        db.rollback()
        raise


def delete_platformsetting(db: Session, setting_id: str) -> dict:
    setting = repository.get_by_id(db, setting_id)
    if not setting:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=f"Platform setting with ID '{setting_id}' not found"
        )
    
    try:
        repository.delete(db, setting_id)
        db.commit()
        return {"message": "Platform setting deleted successfully"}
    except Exception:
        db.rollback()
        raise