public with sharing class LookupController {

    /*
    调用此公用页面的思路
    1.url需要传 对象名
    2.根据 对象名 去判断 检索的字段 limit 注意分页
    3.页面上根据对象名 去判断显示的内容
    4.需要修改的地方 请检索 PleaseJudge 即检索的字段？ where ？ 分页？ 前台显示 ？
    5.对于后面所有调整 请在ModelLendingProduct__c 后面进行分支判断 ，不要修改 请在ModelLendingProduct__c的内容
      因为此自定义元数据 有很多标准对象没有 修改时请考虑 请在ModelLendingProduct__c 功能可以正常使用！
    */

    //页面循环遍历
    public List<LookUpLine> activities { get; set; }

    //参数值
    //模糊检索框
    public string SObjectName {get; set;}

    //定义 本次使用的  对象
    public List<SObject> results {get; set;}

    //模糊检索框
    public string searchString {get; set;}

    //分页用
    private integer totalRecs = 0;
    private integer OffsetSize = 0;
    private integer LimitSize {get; set;}


    //公用标题
    public String title {get; set;}

    //公用搜索名称
    public String searchLabel {get; set;}

    //初始化无参方法
    public LookupController() {

        // 筛选条件搜索框
        //SObjectName
        SObjectName = System.currentPageReference().getParameters().get('SObjectName');

        //模型出借型号
        searchString = System.currentPageReference().getParameters().get('searchLike');

        //暂定一个标题 未来改成公共的 请再此基础上增加判断
        //PleaseJudge 下次调用时，需判断
        if(SObjectName.equals('ModelLendingProduct__c')){
            title = '模型出借型号检索';
            LimitSize = 20;
            searchLabel = '型号or产品名称';
        }else{
            title = '请自定义内容';
            //自定义 10条
            LimitSize = 10;
            searchLabel = 'Name';
        }


        runSearch();

    }

    // 模糊检索方法 精琢技术 wql  20210401 start ----------------------------------
    public PageReference search() {
        runSearch();
        return null;
    }

    private void runSearch() {
        //检索数据
        results = performSearch(searchString);
        //动态拼接传递前台
        setActivities(results);
        System.debug('results:'+results);
        
    }

    private List<SObject> performSearch(string searchString) {
        
        String sql = soql(SObjectName,searchString);
        //考虑超50001 限制
        String totalSQL = sql + ' limit 2000 ';      
        String soql = sql;
        //按创建时间 倒序
            soql = soql + ' order by createdDate desc';
        
            soql = soql + ' limit ' + LimitSize;      
        System.debug(soql);
        
        // if (searchString != '' && searchString != null) {
        //     totalRecs = database.query(sql).size();
        //     OffsetSize= 0;
        // }else{
        //     //总条数
        //     totalRecs = database.query(sql).size();
            
        // }
        OffsetSize= 0;
        totalRecs = database.query(totalSQL).size();
        System.debug('totalRecs:' + totalRecs);

        return database.query(soql);

    }
    //自定义 soql
    public String soql (string SObjectName,string searchString){
        //定义sql  前半部分 -------------------------------------------------
        String soql = 'select id,name ';

        //检索字段集 
        //中间字段 
        String fieldList = ',Product__c,productName__c,ModelAndProductName__c,createdDate  ';

        //如果是查找 自定义元数据 则拼接查找字段 
        //PleaseJudge 下次调用时，需判断
        if(SObjectName.equals('ModelLendingProduct__c')){
            soql = soql + fieldList;
        }
        soql = soql + ' from '+ SObjectName;

        //用于区分 是否有筛选条件的 数据list
        if (searchString != '' && searchString != null){
            //PleaseJudge 下次调用时，需判断
            if(SObjectName.equals('ModelLendingProduct__c')){
                soql = soql +  ' where ModelAndProductName__c LIKE \'%' + searchString + '%\'' ;
            }else{
                soql = soql +  ' where name LIKE \'%' + searchString + '%\'';
            }
            
        }
            
        return soql;

    }

    //检索出的数据 动态构造 传递前台
    private void setActivities(List<SObject> results) {
        //动态赋值 传到前台遍历
        if(results.size()>0){
            activities = new List<LookUpLine>();
            for(Sobject s :results ){
                LookUpLine c = new LookUpLine(SObjectName, s);
                if(c!=null){
                    activities.add(c);
                }
                
            }
            
        }
    }

    // 模糊检索方法 精琢技术 wql  20210401 end ----------------------------------

    //分页 精琢技术 wql  20210401 start -------------------------------------------------
    public List<LookUpLine> getModelCode() {
        if (results == null) {
            results = new list<SObject> ();
            //用于区分 是否有筛选条件的 数据list satrt

            String soql2 = soql(SObjectName,searchString);
            //检索后应该重新给总条数赋值
            // if (searchString != '' && searchString != null) {
            //     totalRecs = database.query(soql2).size();
            // }else{
            //     //总条数
            //     //PleaseJudge 下次调用时，需判断
            //     totalRecs = database.query(soql2).size();
                
            // }
            //考虑超50001 限制
            String totalSQL = soql2 + ' limit 2000 ';   
            totalRecs = database.query(totalSQL).size();
            //用于区分 是否有筛选条件的 数据list end
            System.debug('totalRecs2:' + totalRecs);
            //遍历分页显示的list
            for (SObject pl : Database.Query(soql2+' LIMIT :LimitSize OFFSET :OffsetSize')) {
                    results.add(pl);
                }
            
        }
        //动态传值到前台
        setActivities(results);
        return activities;
    }

    //首页
    public PageReference FirstPage() {
        OffsetSize = 0;
        results = null;
        return null;
    }
    //上一页
    public PageReference previous() {
        OffsetSize = OffsetSize - LimitSize;
        results = null;
        return null;
    }
    //下一页
    public PageReference next() {
        OffsetSize = OffsetSize + LimitSize;
        results = null;
        return null;
    }
    //尾页
    public PageReference LastPage() {
        OffsetSize = totalrecs - math.mod(totalRecs, LimitSize);
        results = null;
        return null;
    }
    //disabled 样式 首页+上一页
    public boolean getprev() {
        if (OffsetSize > 0)
            return false;
        else
            return true;
    }
    //disabled 样式 尾页+下一页
    public boolean getnxt() {
        if ((OffsetSize + LimitSize) < totalRecs){
          System.debug('totalRecs2:'+totalRecs);
          System.debug('OffsetSize2:'+OffsetSize);
          System.debug('false1');
            return false;
        }else{
            System.debug('false2');
            return true;
        }

    }
    //获取页码
    public Integer getPageNumber() {
        
        //限制最多检索2000条时有问题
        integer osCount = 0;
        if(OffsetSize == 2000){
            osCount = OffsetSize / LimitSize;
        }else{
            osCount = OffsetSize / LimitSize + 1;
        }

        return osCount;

        //原逻辑
        //return OffsetSize / LimitSize + 1;

    }
    //获取总页数
    public Integer getTotalPages() {
        
        if (math.mod(totalRecs, LimitSize) > 0) {
            return totalRecs / LimitSize + 1;
        } else {
            return (totalRecs / LimitSize);
        }
    }
    //分页 精琢技术 wql  20210401 end -------------------------------------------------
    
    //发现 action的执行先后顺序有问题 使用actionFunction 强行将 分页按钮刷新的顺序排在最后 satrt
    public PageReference loadPage() {
        getprev();
        getnxt();
        getPageNumber();
        getTotalPages();
        

        return null;
    }
    //发现 action的执行先后顺序有问题 使用actionFunction 强行将 分页按钮刷新的顺序排在最后 end

    //封装类 自定义 字段 用于前台遍历
    public class LookUpLine {
        //标准id字段
        public Id Id { get; set; }
        //String 自定义字段
        public String  Lid{ get; set; }   
        public String  Name { get; set; }
        public String  LName { get; set; }

            //有参构造 
            //PleaseJudge 下次调用时，需判断
            public LookUpLine(String SObjectName,SObject so) {
                if(SObjectName.equals('ModelLendingProduct__c')){
                    this.Id = (Id)so.get('id');
                    this.Name =(String)so.get('name');
                    this.Lid =(String)so.get('Product__c');
                    this.LName =(String)so.get('productName__c');

                }else{
                    this.Id = (Id)so.get('id');
                    this.Name =(String)so.get('name');
                }

        }

    }

    


}