package tracker;

import java.io.File;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import com.querydsl.jpa.impl.JPAUpdateClause;
import object.QUserPT;
import object.UserPT;
import object.TTorent;
import object.TransRecord;

public class Tracker implements TrackerInterface {
    private static final EntityManagerFactory emf =
        Persistence.createEntityManagerFactory("myPersistenceUnit");

    @Override
    public boolean AddUpLoad(String userid, int upload) {
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        try {
            tx.begin();
            QUserPT q = QUserPT.userPT;
            long updated = new JPAUpdateClause(em, q)
                .where(q.userid.eq(userid))
                .set(q.upload, q.upload.add(upload))
                .execute();
            tx.commit();
            return updated > 0;
        } catch(Exception e) {
            if (tx.isActive()) tx.rollback();
            return false;
        } finally {
            em.close();
        }
    }

    @Override
    public boolean ReduceUpLoad(String userid,int upload){
        return false;
    };//给用户减上传量，返回0成功，返回1失败;

    @Override
    public boolean AddDownload(String userid,int download){
        return false;
    };//给用户增加下载量，返回0成功，返回1失败;

    @Override
    public boolean ReduceDownload(String userid,int download){
        return false;
    };//给用户减少下载量，返回0成功，返回1失败;

    @Override
    public boolean AddMagic(String userid,int magic){
        return false;
    };//给用户增加魔力值，返回0成功，返回1失败;

    @Override
    public boolean ReduceMagic(String userid,int magic){
        return false;
    };//给用户减少魔力值，返回0成功，返回1失败;

    @Override
    public TTorent ReadTorrent(File torrent){
        return new TTorent();
    };//传入torrent文件，解析后返回TTorent类

    @Override
    public int SaveTorrent(TTorent seed,String seedid){
        return 0;
    };//保存seedid对应的ttorent信息

    @Override
    public File GetTTorent(String seedid,String userid){
        return null;
    };//根据种子id获得ttorent信息然后构建Ttorent文件并返回,同时记录用户的下载行为


    @Override
    public int AddRecord(String seedid,TransRecord rd){
        return 0;
    };//新增一个seedid对应的种子的传输任务记录
}
