from typing import List, Optional
from sqlalchemy.orm import Session
from mooc.models.admin import Admin,Account,AccountWebapp
from mooc.schemas.admin import AdminCreate, AdminUpdate,AccountCreate, AccountUpdate, AccountWebappCreate, AccountWebappUpdate


class CRUDAdmin:
    def get(self, db: Session, id: int) -> Optional[Admin]:
        return db.query(Admin).filter(Admin.id == id).first()

    def get_by_username(self, db: Session, username: str) -> Optional[Admin]:
        return db.query(Admin).filter(Admin.username == username).first()

    def get_multi(
        self, db: Session, *, skip: int = 0, limit: int = 100
    ) -> List[Admin]:
        return db.query(Admin).offset(skip).limit(limit).all()

    def create(self, db: Session, *, obj_in: AdminCreate) -> Admin:
        db_obj = Admin(
            weid=obj_in.weid,
            username=obj_in.username,
            password=obj_in.password,  # ע�⣺ʵ��ʹ��ʱӦ�ö�������й�ϣ����?
            pcate_id=obj_in.pcate_id,
            cate_id=obj_in.cate_id,
            relation_id=obj_in.relation_id,
            is_delete=obj_in.is_delete
        )
        db.add(db_obj)
        db.commit()
        db.refresh(db_obj)
        return db_obj

    def update(
        self, db: Session, *, db_obj: Admin, obj_in: AdminUpdate
    ) -> Admin:
        update_data = obj_in.dict(exclude_unset=True)
        for field, value in update_data.items():
            setattr(db_obj, field, value)
        db.add(db_obj)
        db.commit()
        db.refresh(db_obj)
        return db_obj

    def delete(self, db: Session, *, id: int) -> Admin:
        obj = db.query(Admin).get(id)
        if obj:
            obj.is_delete = 1
            db.add(obj)
            db.commit()
        return obj

admin = CRUDAdmin()



class CRUDAccount:
    def get_by_uniacid(self, db: Session, *, uniacid: int) -> Optional[Account]:
        return db.query(Account).filter(Account.uniacid == uniacid).first()

account = CRUDAccount()




class CRUDAccountWebapp:
    def create(self, db: Session, *, obj_in: AccountWebappCreate) -> AccountWebapp:
        db_obj = AccountWebapp(**obj_in.dict())
        db.add(db_obj)
        db.commit()
        db.refresh(db_obj)
        return db_obj

    def get(self, db: Session, acid: int) -> Optional[AccountWebapp]:
        return db.query(AccountWebapp).filter(AccountWebapp.acid == acid).first()

    def update(
        self,
        db: Session,
        *,
        db_obj: AccountWebapp,
        obj_in: AccountWebappUpdate
    ) -> AccountWebapp:
        data = obj_in.dict(exclude_unset=True)
        for field, value in data.items():
            setattr(db_obj, field, value)
        db.add(db_obj)
        db.commit()
        db.refresh(db_obj)
        return db_obj

    def delete(self, db: Session, acid: int) -> None:
        obj = db.query(AccountWebapp).filter(AccountWebapp.acid == acid).first()
        if obj:
            db.delete(obj)
            db.commit()

account_webapp = CRUDAccountWebapp()