/**
 * 一覧共通component用
 * 
 */
public with sharing abstract class CreateRelationListPagingCtrlBase {

    // 打勾后要不要trigger一个Event
    public Boolean isNeedCheckEvent {
        get {
            if (isNeedCheckEvent == null) { return false; }
            return isNeedCheckEvent;
        }
        set;
    }
    public Boolean isNeedSearchFirst {
        get {
            if (isNeedSearchFirst == null) { return false; }
            return isNeedSearchFirst;
        }
        set;
    }
    // checkEventより、遷移先のurlを返す
    // assignTo="{!clickLineNo}" より url を組み立てる
    public virtual void checkEvent() { }

    // 検索条件なしで、検索を行わない
    public Boolean isNeedRunSearch { get; set; }
    public abstract Boolean getIsNeedRunSearch();

    // 画面パラメータ：親Id
    public String parentId { get; set; }
    // 親オブジェクトAPI名
    public String selectedDataSql;
    public abstract String getSelectedDataSql();

    // 検索元対象オブジェクトAPI名
    public String originObjName;
    public abstract String getOriginObjName();
    // 検索元対象項目セット
    public String originObjColumns;
    public abstract String getOriginObjColumns();

    // 選択されたデータリスト
    public List<SObject> selectedData { get; set; }
    // 選択されたデータの連絡先のIdリスト
    public List<Id> selectedFKIdList { get; set; }
    // 選択されたデータIdのSet
    public Set<Id> selectedIdSet { get; set; }

    // 画面件数毎ページ
    public String pageSize { get; set; }
    // ソートキー
    public String sortKey { get; set; }
    // ソートキー（前回）
    public String preSortKey { get; set; }

    // システムのOFFSET_LIMIT より小さい検索Limitにしたい場合、定義する
    public Integer searchNumMax;
    public abstract Integer getSearchNumMax();      // 定义 > 2000 的话, 不能用offset来翻页
    // オブジェクトAPI名
    public String objName;
    public abstract String getObjName();
    // Where文
    public String sqlWhereStr;
    public abstract String getSqlWhereStr();
    public virtual String getOrderbyStr() {
        return null;
    }
    // 左の項目セット
    public String columnLeftFieldSetName;
    public abstract String getColumnLeftFieldSetName();
    // 右の項目セット
    public String columnRightFieldSetName;
    public abstract String getColumnRightFieldSetName();
    // Select 里加直接加的項目 List
    public abstract List<String> getColumnFieldList();
    // Hidden項目 List
    public virtual List<String> getHiddenFieldList() {
        return new List<String>();
    }
    // 宽度是0的項目
    public virtual String getWidth0Field() {
        return '';
    }
    // 画面里直接可以输入的項目 List
    public virtual List<String> getWritableColumnFieldList() {
        return new List<String>();
    }
    // getObjName 连 getOriginObjName 的 FK
    public abstract String getFKColumnField();

    public Integer clickLineNo  { get; set; }

    // 検索結果メッセージ表示
    public Boolean showRecordCountMSG { get; set; }
    public virtual Boolean getShowRecordCountMSG() {
        return true;
    }

    // ページレイアウトを収得するのレコードタイプ
    public String recordTypeId;
    public abstract String getRecordTypeId();
    // 共通コンポーネントにも参照できるwrapperリスト
    public List<WrapperInfo> viewList;
    public List<WrapperInfo> getViewList(){return viewList;}
    public abstract void setViewList(List<SObject> rSObject);

    public CreateRelationListPagingCmpCtrl myComponentController;

    public CreateRelationListPagingCmpCtrl getMyComponentController() {
        return myComponentController;
    }

    public void setComponentController(CreateRelationListPagingCmpCtrl compController) {
        System.debug('SSSSSSSSSSSSSSSSS: setComponentController start');
        myComponentController = compController;
    }

    public CreateRelationListPagingCtrlBase getThis() {
        return this;
    }
    public CreateRelationListPagingCtrlBase(){
    }

    public void makeSelectedDataInfo() {
        selectedFKIdList = new List<Id>();
        selectedIdSet = new Set<Id>();
        for (Sobject mf : selectedData) {
            if (!String.isBlank(getFKColumnField())
                    && mf.get(getFKColumnField()) != null) {
                selectedFKIdList.add((Id) mf.get(getFKColumnField()));
            }
            selectedIdSet.add(mf.Id);
        }
    }

    public class WrapperInfo implements Comparable {
        public SObject sobj { get; set; }
        // public Map<String, Object> sobjMap { get; set; }
        public Boolean canEdit { get;  set; }
        public Boolean hasError { get;  set; }
        public Boolean hasFieldError { get;  set; }
        public Integer lineNo { get;  set; }
        public Integer orderNo { get;  set; }
        public String changeFlg { get; set; }
        public Boolean check { get; set; } // 是否选择
        public Boolean oldCheck { get; set; }
        public Integer inputInt {get; set;}  // 数量

        public Map<String, String> additionalInfoMap {get; set;}  // 追加信息

        public WrapperInfo(SObject record, CreateRelationListPagingCmpCtrl myComponentController) {
            if (record == null) {
                throw new ControllerUtil.myException('new WrapperInfo with null record.');
            }
            sobj = record;
            check = false;
            oldCheck = false;
            canEdit = true;
            // For JS index
            lineNo = 0;
            // For JS index
            orderNo = 0;
            changeFlg = '0';
            additionalInfoMap = new Map<String, String>();
            // // field name の階層を一階層にする
            // sobjMap = new Map<String, Object>();
            // for (List<String> splitFieldPath : myComponentController.columnsLeftApi) {
            //     if (splitFieldPath.size() == 2) {
            //         if (record.getSObject(splitFieldPath[0]) == null) {
            //             sobjMap.put(splitFieldPath[0] + '.' + splitFieldPath[1], '');
            //         } else {
            //             sobjMap.put(splitFieldPath[0] + '.' + splitFieldPath[1],
            //                     record.getSObject(splitFieldPath[0]).get(splitFieldPath[1]));
            //         }
            //     }
            // }
            // for (List<String> splitFieldPath : myComponentController.columnsRightApi) {
            //     if (splitFieldPath.size() == 2) {
            //         if (record.getSObject(splitFieldPath[0]) == null) {
            //             sobjMap.put(splitFieldPath[0] + '.' + splitFieldPath[1], '');
            //         } else {
            //             sobjMap.put(splitFieldPath[0] + '.' + splitFieldPath[1],
            //                     record.getSObject(splitFieldPath[0]).get(splitFieldPath[1]));
            //         }
            //     }
            // }
        }

        // 排序
        public Integer compareTo(Object compareTo) {
            WrapperInfo compareToWrap = (WrapperInfo) compareTo;
            if (orderNo == null && compareToWrap.orderNo != null) {
                return 1;
            }
            if (orderNo == compareToWrap.orderNo) {
                return 0;
            }
            if (orderNo > compareToWrap.orderNo) {
                return 1;
            }
            return -1;
        }
    }
}