package com.trs.example;

import java.util.HashMap;

import com.trs.TRSWCMBaseTest;
import com.trs.cms.auth.persistent.User;
import com.trs.components.wcm.content.persistent.Document;
import com.trs.components.wcm.content.persistent.Documents;
import com.trs.infra.common.WCMException;
import com.trs.infra.persistent.WCMFilter;
import com.trs.infra.util.CMyDateTime;
import com.trs.infra.util.CPager;
import com.trs.webframework.controler.JSPRequestProcessor;

public class DocumentExample extends TRSWCMBaseTest {
    public void query1() throws WCMException {        
        
        
        // 1 构造查询语句(注：集合和元素都知道自己管理那张表，所以第一个参数From可以不用输入)
        WCMFilter filter = new WCMFilter("", "DocId>=1 and DocId<=10", "",
                "DocTitle,DocId,CrUser");

        // 2 发出查询请求，获取结果对应的集合
        Documents documents = Documents.openWCMObjs(null, filter);

        // 3 遍历集合，输出每条记录的数据
        for (int i = 0, nSize = documents.size(); i < nSize; i++) {
            Document document = (Document) documents.getAt(i);
            if (document == null)
                continue;
            // 元素的属性也可通过getXXX获取
            System.out.println("Doctitle：" + document.getTitle());
            // 元素的属性也可通过通过方法getProperty(XXX)获取
            // 其中XXX为字段名，不区分大小写
            System.out.println("Doctitle：" + document.getProperty("DocTitle"));
            
            // 字段名不区分大小写
            int nDefault = -1;// 定义字段没有设置值的时默认值
            document.getPropertyAsInt("MyField1", nDefault);
        }// END For

    }

    public void query2() throws WCMException {
        // 1 构造查询语句并设置Where用到的参数
        WCMFilter filter = new WCMFilter("",
                "CrUser=? and DocId<=? and CrTime<=?", "",
                "DocTitle,DocId,CrUser");
        filter.addSearchValues("admin");
        filter.addSearchValues(10);
        filter.addSearchValues(CMyDateTime.now());

        // 2 通过对应的集合对象发出查询请求，获取结果对应的集合
        Documents documents = Documents.openWCMObjs(null, filter);

        // 3 遍历集合，输出每条记录的数据
        for (int i = 0, nSize = documents.size(); i < nSize; i++) {
            Document document = (Document) documents.getAt(i);
            if (document == null)
                continue;
            // 元素的属性也可通过getXXX获取
            System.out.println("Doctitle：" + document.getTitle());
        }// END For
    }

    public void query3() throws WCMException {
        // 1 构造查询语句并设置Where用到的参数
        WCMFilter filter = new WCMFilter("", "CrUser=? and DocId<=?", "",
                "DocTitle,DocId,CrUser");
        filter.addSearchValues("admin");
        filter.addSearchValues(10);

        // 2 通过对应的集合对象发出查询请求，获取结果对应的集合
        Documents documents = Documents.openWCMObjs(null, filter);

        // 3 构造分页对象
        int nPageSize = 3; // 分页大小
        int nCurrPageIndex = 2; // 当前显示第几页，从1开始
        CPager pager = new CPager(nPageSize);
        pager.setItemCount(documents.size());
        pager.setCurrentPageIndex(nCurrPageIndex);

        // 4 遍历集合，输出每条记录的数据
        for (int i = pager.getFirstItemIndex(); i < pager.getLastItemIndex(); i++) {
            Document document = (Document) documents.getAt(i - 1);
            if (document == null)
                continue;
            // 元素的属性也可通过getXXX获取
            System.out.println("Doctitle：" + document.getTitle());
        }// END For
    }

    public void deleteObjects() throws WCMException {
        // 0 获取当前操作的用户，此处假定为admin
        User loginUser = User.findByName("admin");

        // 1 获取需要删除的文档
        String sDeleteDocumentIds = "23,45,67";
        Documents documents = Documents
                .findByIds(loginUser, sDeleteDocumentIds);

        // 2 发出删除请求
        // 为了防止误操作，先将代码注释掉
        // documents.removeAll(true);
    }

    public void deleteObject() throws WCMException {
        // 0 获取当前操作的用户，此处假定为admin
        User loginUser = User.findByName("admin");

        // 1 获取需要删除的文档
        int nDeleteDocId = 23;
        Document document = Document.findById(nDeleteDocId);

        // 2 发出删除请求
        // 为了防止误操作，先将代码注释掉
        // document.delete(loginUser);
    }

    public void insertDocument() throws WCMException {
        // 0 获取当前操作的用户，此处假定为admin
        User loginUser = User.findByName("admin");

        // 1 产生元素对象的实例
        Document document = Document.createNewInstance();

        // 2 设置必要的属性
        document.setTitle("刚刚新增的文档");
        document.setPropertyWithString("DocTitle", "刚刚新增的文档");// 也可以这样设置属性
        document.setChannel(43);
        document.setContent("正文内容");
        document.setHtmlContent("<b>加粗的字体</b>测试图文混排的正文");

        // 3 执行保存操作，插入到数据库中
        document.save(loginUser);
    }

    public void updateDocument() throws WCMException {
        // 0 获取当前操作的用户，此处假定为admin
        User loginUser = User.findByName("admin");

        // 1 产生元素对象的实例
        int nDocId = 23;
        Document document = Document.findById(nDocId);

        // 2 判断是否可以修改，如果可以修改同时锁定，不可以抛出异常
        document.validCanEditAndLock(loginUser);

        // 3 修改标题
        document.setTitle("这篇文档我修改了一下标题，呵呵，加入一个标记" + System.currentTimeMillis());

        // 4 执行保存操作，将所做修改保存入库
        document.save(loginUser);
    }

    public boolean containsById() throws WCMException {
        Documents documents = new Documents(null);

        // 判断指定文档集合是否包含ID为23的文档
        int nDocId = 23;
        boolean bExists = (documents.indexOf(nDocId) >= 0);

        return bExists;
    }

    public Document getById() throws WCMException {
        Documents documents = new Documents(null);

        // 获取指定文档集合中指定文档Id为23的文档
        int nDocId = 23;
        Document document = (Document) documents.getById(nDocId);

        return document;
    }

    public Document getByIndex() throws WCMException {
        Documents documents = new Documents(null);

        // 获取指定文档集合中第三条记录的文档
        int nIndex = 2;
        Document document = (Document) documents.getAt(nIndex);

        return document;
    }

    public void remove() throws WCMException {
        Documents documents = new Documents(null);

        // 移除指定文档集合中第三条记录的文档
        int nIndex = 2;
        documents.removeAt(nIndex, false);

        // 移除指定文档集合中ID为23的文档
        int nDocId = 23;
        documents.remove(nDocId, false);
    }

    public void remove2() throws WCMException {
        Documents documents = new Documents(null);

        // 错误代码：下标不应该递增
        for (int i = 0, nSize = documents.size(); i < nSize; i++) {
            Document document = (Document) documents.getAt(i);
            if (hasRight(document))
                continue;

            documents.removeAt(i, false);
        }// END For

        // 正确代码：下标应该递减
        for (int i = documents.size() - 1; i >= 0; i--) {
            Document document = (Document) documents.getAt(i);
            if (hasRight(document))
                continue;

            documents.removeAt(i, false);
        }// END For

    }

    private boolean hasRight(Document document) {
        return false;

    }

    public void queryFromOtherTable() throws WCMException {
        // 1 从WCMChnlDoc中读取
        WCMFilter filter = new WCMFilter("WCMChnlDoc",
                "DocChannel=? and Modal=1 Group by DocId", "DocId desc", "DocId");
        filter.addSearchValues(43);
        

        // 2 构造Documents集合，将MaxSize和PageSize大小设置一样
        int nExpectMaxCount = 100;
        filter.setMaxRowNumber(nExpectMaxCount);
        filter.setPageSize(nExpectMaxCount);
        Documents documents = Documents.openWCMObjs(null, filter);

        // 3 发出查询请求，从DB读取数据
        documents.open(filter);
        
        for (int i = 0, nSize = documents.size(); i < nSize; i++) {
            Document document = (Document) documents.getAt(i);

            System.out.println("StatusId：" + document.getStatusId());
        }// END For
    }
}
