from ..models.users import User as users
from ..models.post import Post as post
import secrets
import hashlib
from datetime import datetime, timedelta
from sqlalchemy.orm import Session
class Fpost:
    def __init__(self,session:Session):
        self.session=session
        return
    

    def getlist(self):
        results = self.session.query(post.id, post.title,post.status)
        return results
    def getpost(self,postid):
        res=self.session.query(post).filter(post.id==postid).first()
        return res
    def checkid(self,userid):
        res=self.session.query(users).filter(users.id==userid).first()
        if(not res):
            return False
        if res.role !='superadmin':
            return False
        return True
    
    def review(self,postid,status):
        print(status)
        res=self.session.query(post).filter(post.id==postid).first()
        if not res:
            return False
        res.status=status
        self.session.commit()
        return True
    
    def createtoken(self, userid):
        """
        根据userid创建token并插入到数据库
        :param userid: 用户ID
        :return: 生成的token字符串
        """
        # 生成随机盐值
        salt = secrets.token_hex(16)
        
        # 创建哈希值：userid + 当前时间戳 + 随机盐值
        current_time = str(datetime.now().timestamp())
        hash_input = f"{userid}_{current_time}_{salt}"
        
        # 生成SHA256哈希值作为token
        token = hashlib.sha256(hash_input.encode()).hexdigest()
        
        # 设置时间
        created_time = datetime.now()
        expires_time = created_time + timedelta(days=1)  # 一天后过期
        
        try:
            # 创建新的token记录
            new_token = Token(
                token=token,
                expires_at=expires_time,
                created_at=created_time
            )
            
            # 假设self.session是数据库会话对象
            self.session.add(new_token)
            self.session.commit()
            
            return token
            
        except Exception as e:
            self.session.rollback()
            raise Exception(f"创建token失败: {str(e)}")