from typing import List
from sqlalchemy import func
from sqlalchemy.orm import Session
from app.api.digital_asset_acquisition import schema
from app.dependency.authantication import JWTPayloadSchema
from app.models.main.digital_asset_acquisition import DigitalAssetBase, TblDigitalAsset
from app.utils.schemas_utils import CustomResponse
from app.locale.messages import Messages
from fastapi import HTTPException

class DigitalAssetServise:
    def __init__(self, db:Session, token:JWTPayloadSchema):
        self.db = db
        self.token = token
        
    async def create_digital_asset(self, request:List[schema.DigitalAssetCreate]):
        created_digital_asset = []
        for item in request:
            sale = TblDigitalAsset.create_digital_asset(item, self.db)
            created_digital_asset.append(sale)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.DIGITAL_ASSET)
    
    async def get_digital_asset(self, group_id:int):
        new_get_digital_asset = TblDigitalAsset.get_digital_asset(group_id, self.db)
        if not new_get_digital_asset:
            raise HTTPException(status_code=404, detail="Get group ID not found")
        return [schema.DigitalAssetResponse.model_validate(get_group) for get_group in new_get_digital_asset]
    
    async def get_sum_of_estimate_cost(self) ->"TblDigitalAsset":
        new_get_sum_of_estimate_cost = self.db.query(func.sum(TblDigitalAsset.estimate_cost)).scalar()
        return new_get_sum_of_estimate_cost
    
    async def update_digital_asset(self, request:schema.DigitalAssetUpdate):
        updated_digital_asset = DigitalAssetBase.model_validate(request.model_dump())
        if updated_digital_asset.digital_id is None:
            return CustomResponse(status="-1", message=Messages.DIGITAL_ASSET_NOT)
        TblDigitalAsset.update_digital_asset(updated_digital_asset.digital_id, updated_digital_asset, self.db)
        return CustomResponse(status="1", message=Messages.DIGITAL_ASSET_UPDATE)
    
    async def delete_digital_asset(self, group_id:List[int]):
        deleted_digital_asset = TblDigitalAsset.delete_digital_asset(group_id, self.db)
        if not deleted_digital_asset:
            return CustomResponse(status="-1", message=Messages.DIGITAL_ASSET_NOT)
        return CustomResponse(status="1", message=Messages.DIGITAL_ASSET_DELETE)