public with sharing class SearchProductController {

    public Integer quoteEntryMaxSet {get; private set;}

    public List<ProductLine> cl {get;set;}
    public Boolean getHascl() {
        Boolean rtn = true;
        if (cl != null && cl.size() > 0) {
            rtn = false;
        }
        return rtn;
    }

    public String searchMode;                         // 検索モード
    public String openFlag {get;set;}                 // 親画面Flag
    public String lineNo {get;set;}                   // 親画面の選択した行
    public String val {get;set;}
    public String setStr {get;set;}
    public String oppId {get;set;}                    // 親画面のからの検索文字列
    public String SearchName {get;set;}               // 検索文字列
    public String baseUrl { get; set; }
    public String productSetVal {get;set;}
    public boolean oppflg {get;set;}

    public String productSegment {get;set;}

    public String openType {get;set;}

    public List<SelectOption> productSet { get; set; }

    public boolean is_hidden_user { get; set; }
    public boolean is_dealer_user { get; set; }

    public Boolean is_hidden_all { get; set; }

    public Boolean specialDealer { get; set; }

    public SearchProductController(ApexPages.StandardController controller){
        this();
    }

    public SearchProductController() {
        this.quoteEntryMaxSet = Integer.valueOf(System.Label.QuoteEntryMaxSet);
        //XHL-20190428-UpdateStart
        //this.productSetVal = Apexpages.currentPage().getParameters().get('set');
        //if (productSetVal!=null || productSetVal!=''){
        //} else {
        //   this.productSetVal = '单品';
        //}
        //XHL-20190428-UpdateEnd
        is_hidden_user = false;
        // String profileid = UserInfo.getProfileId().subString(0,15);

        //新的获取简档ID  calendarUtil.getMemberProfileID  这里用到的人员ID 和获取到的简档ID都是15位的
        String new_profileId = calendarUtil.getMemberProfileID(UserInfo.getUserId().subString(0,15));

        if (new_profileId.substring(0, 15) == System.Label.RT_BS_No_Price) {
            is_hidden_user = true;
        }
        is_dealer_user = false;
        if (UserInfo.getUserType() == 'PowerPartner') {
            is_dealer_user = true;
        }

        //XHL-20190428-UpdateStart
        //this.productSet = new List<SelectOption>();
        //this.productSet.add(new SelectOption('单品','单品'));
        //this.openType = Apexpages.currentPage().getParameters().get('openType');
        //if (openType == 'service') {
        //    this.productSet.add(new SelectOption('set01','零件费用'));
        //    this.productSet.add(new SelectOption('set02','维修费'));
        //    this.productSet.add(new SelectOption('set03','其他费用'));
        //} else {
        //    for (Integer i = 0; i < this.quoteEntryMaxSet; i++) {
        //        if (i < 9) {
        //            this.productSet.add(new SelectOption('set0'+ String.valueOf(i+1),'套装0'+ String.valueOf(i+1)));
        //        } else {
        //            this.productSet.add(new SelectOption('set'+ String.valueOf(i+1),'套装'+ String.valueOf(i+1)));
        //        }
        //    }
        //}
        //XHL-20190428-UpdateEnd
        this.openFlag = Apexpages.currentPage().getParameters().get('openFlag');
        this.lineNo = Apexpages.currentPage().getParameters().get('lineno');
        this.val = Apexpages.currentPage().getParameters().get('val');
        this.oppId = Apexpages.currentPage().getParameters().get('oppId');

        if (openFlag == 'opp') {
            oppflg = false;
        } else {
            oppflg = true;
        }

        if (val!=null && val!=''){
            SearchName = val;
            val = null;
        }

        cl = new List<ProductLine>();
    }

    public void init () {
        system.debug('init==========> start');
        system.debug('SearchName==========>' + SearchName);
        if (SearchName != null && SearchName != '') {
            serContact();
        }

        system.debug('init==========> end');

    }

    public PageReference serContact(){
        //is_hidden_all = false;
        is_hidden_all = true;
        List<Opportunity> oppList = [select Id,DealerId__c,RecordTypeId,CurrencyIsoCode,Pricebook2Id,ProductSegment__c,Machine_Parts__c,SalesChannel__c From Opportunity where Id = :oppid];
        //List<Opportunity> oppList = [select Id,DealerId__c,RecordTypeId,CurrencyIsoCode,Pricebook2Id,ProductSegment__c,Machine_Parts__c,SalesChannel__c,DealerId__c From Opportunity where Id = :oppid];
        //is_hidden_all = StaticParameter.specialDealerMap.containsKey(oppList[0].DealerId__c);
        //is_hidden_all = !StaticParameter.specialDealerMap.containsKey(oppList[0].DealerId__c);
        is_hidden_all = !IfspecialDealer(oppList[0].DealerId__c);
        system.debug('is_hidden_all---->'+is_hidden_all);
        String sCurrencyIsoCode = oppList[0].CurrencyIsoCode;
        String sPricebook2Id = oppList[0].Pricebook2Id;
        String sProductSegment = oppList[0].ProductSegment__c;
        productSegment =  oppList[0].ProductSegment__c;   
        boolean is_Parts_direct = false;
        boolean is_Replacement = false;
        if(oppList[0].RecordTypeId == System.Label.SSBD_Replacement){
            is_Replacement = true;
        }
        if (oppList[0].Machine_Parts__c == 'Parts' && oppList[0].SalesChannel__c == 'direct') {
            is_Parts_direct = true;
        }
        //if(StaticParameter.specialDealerMap.containsKey(oppList[0].DealerId__c)){
        if(IfspecialDealer(oppList[0].DealerId__c)){
            is_hidden_user = true;
            specialDealer = true;
        }
        system.debug('sCurrencyIsoCode==========>' + sCurrencyIsoCode);
        system.debug('sPricebook2Id==========>' + sPricebook2Id);

        String searchSql = 'select Id,Product2Id,SalesPrice__c,SalesPriceA__c,SalesPriceB__c,SalesPriceC__c,CostPrice__c,Pricebook2Id,Product2.ProductModels__c,Hidden_flag__c from PricebookEntry';
        //20191113-XHL---Start-将产品状态(ProductStatus__c)用产品状态(公式)(ProductStatusFormula__c)替换
        //String whereStr = '  Where (Product2.ProductModels__c = true or (SalesPrice__c > 0 and (CostPrice__c > 0 or Product2.Dummy__c = true))) and Product2.ProductStatus__c = \'1\' and Pricebook2Id = :sPricebook2Id and CurrencyIsoCode = :sCurrencyIsoCode';
        String whereStr = '';
        if(is_Replacement){
            boolean temp = !is_Replacement;
            whereStr = '  Where (Product2.ProductModels__c = true or (SalesPrice__c > 0 and (CostPrice__c > 0 or Product2.Dummy__c = true))) and Product2.ProductStatusFormula__c = \'1\' and Pricebook2Id = :sPricebook2Id and CurrencyIsoCode = :sCurrencyIsoCode and Product2.isMain__c =:temp';
            //20191113-XHL---End-将产品状态(ProductStatus__c)用产品状态(公式)(ProductStatusFormula__c)替换
            //String whereStr = '  Where (Product2.ProductModels__c = true or (SalesPrice__c > 0)) and Product2.ProductStatus__c = \'1\' and Pricebook2Id = :sPricebook2Id and CurrencyIsoCode = :sCurrencyIsoCode';
        
        }else{
            whereStr = '  Where (Product2.ProductModels__c = true or (SalesPrice__c > 0 and (CostPrice__c > 0 or Product2.Dummy__c = true))) and Product2.ProductStatusFormula__c = \'1\' and Pricebook2Id = :sPricebook2Id and CurrencyIsoCode = :sCurrencyIsoCode ';
            //20191113-XHL---End-将产品状态(ProductStatus__c)用产品状态(公式)(ProductStatusFormula__c)替换
            //String whereStr = '  Where (Product2.ProductModels__c = true or (SalesPrice__c > 0)) and Product2.ProductStatus__c = \'1\' and Pricebook2Id = :sPricebook2Id and CurrencyIsoCode = :sCurrencyIsoCode';
        
        }
        /*String whereStr = '  Where (Product2.ProductModels__c = true or (SalesPrice__c > 0 and (CostPrice__c > 0 or Product2.Dummy__c = true))) and Product2.ProductStatusFormula__c = \'1\' and Pricebook2Id = :sPricebook2Id and CurrencyIsoCode = :sCurrencyIsoCode and Product2.isReplacement__c =:is_Replacement';
        //20191113-XHL---End-将产品状态(ProductStatus__c)用产品状态(公式)(ProductStatusFormula__c)替换
        //String whereStr = '  Where (Product2.ProductModels__c = true or (SalesPrice__c > 0)) and Product2.ProductStatus__c = \'1\' and Pricebook2Id = :sPricebook2Id and CurrencyIsoCode = :sCurrencyIsoCode';*/
        if (is_Parts_direct) {
            //20191113-XHL---Start-将产品状态(ProductStatus__c)用产品状态(公式)(ProductStatusFormula__c)替换
            //whereStr = '  Where Product2.ProductStatus__c = \'1\' and Pricebook2Id = :sPricebook2Id and CurrencyIsoCode = :sCurrencyIsoCode';
            whereStr = '  Where Product2.ProductStatusFormula__c = \'1\' and Pricebook2Id = :sPricebook2Id and CurrencyIsoCode = :sCurrencyIsoCode';
            //20191113-XHL---End-将产品状态(ProductStatus__c)用产品状态(公式)(ProductStatusFormula__c)替换
        }
        String whereSql = ' and Product2.ManualHidden__c = false ' ;
        if (SearchName != null && SearchName != '') {
            String likename = String.escapeSingleQuotes(SearchName);
            String prdcd = String.escapeSingleQuotes(SearchName);
            String prdec = String.escapeSingleQuotes(SearchName);
            if (likename.indexOf('*') >= 0) {
                likename = likename.replace('*', '%');
            } else {
                likename = '%' + likename + '%';
            }
            if (prdcd.indexOf('*') >= 0) {
                prdcd = prdcd.replace('*', '%');
            } else {
                prdcd = '%' + prdcd + '%';
            }
            if (prdec.indexOf('*') >= 0) {
                prdec = prdcd.replace('*', '%');
            } else {
                prdec = '%' + prdec + '%';
            }
            whereSql += ' and (Product2.Name Like ' + '\'' + likename + '\' or Product2.ProductCode Like ' + '\'' + prdcd + '\' or Product2.Product_ECCode__c like ' + '\'' + prdec + '\')';
        }

        searchSql = searchSql + whereStr + whereSql;
        searchSql += ' order by Product2.ProductModels__c desc, Product2.ProductCode limit 200';
        System.debug('searchSql::::::' + searchSql);

        List<PricebookEntry> pbes = Database.query(searchSql);

        System.debug('pbes::::::' + pbes);

        if (pbes.size() > 0) {

            List<String> forSelect = new List<String>();

            for (PricebookEntry pbe : pbes) {
                forSelect.add(pbe.Product2Id);
            }

            System.debug('forSelect::::::' + forSelect);

            List<Product_Search__c>  productSearchList = [select Id,Name,ProductCode__c,Product_ECCode__c,ProductModels1__c, ProductDescription__c,ProductStatus__c,Product__c
                                                            from Product_Search__c
                                                           where Product__c in : forSelect];

            System.debug('productSearchList::::::' + productSearchList);

            Map<String, Product_Search__c> tempMap = new Map<String, Product_Search__c>();

            for (Product_Search__c productSearch : productSearchList) {
                tempMap.put(productSearch.Product__c, productSearch);
            }

            System.debug('tempMap::::::' + tempMap);

            Integer lineNo = 0;
            cl = new List<ProductLine>();
            for (Integer i = 0; i < pbes.size(); i++) {
                System.debug('tempMap.get(pbes[i].Product2Id)::::::' + tempMap.get(pbes[i].Product2Id));
                Product_Search__c ps = tempMap.get(pbes[i].Product2Id);
                if (ps != null) {
                    if (pbes[i].SalesPrice__c == null) {
                        ProductLine pl = new ProductLine(lineNo, ps, pbes[i].Id,'0.00','0.00','0.00','0.00',pbes[i].Pricebook2Id,pbes[i].Hidden_flag__c);
                        cl.add(pl);
                    } else {
                        ProductLine pl = new ProductLine(lineNo, ps,pbes[i].Id,
                                                         String.valueOf(pbes[i].SalesPrice__c),
                                                         String.valueOf(pbes[i].SalesPriceA__c),
                                                         String.valueOf(pbes[i].SalesPriceB__c),
                                                         String.valueOf(pbes[i].SalesPriceC__c),
                                                         pbes[i].Pricebook2Id,
                                                         pbes[i].Hidden_flag__c);
                        if (is_hidden_user == true || is_dealer_user == true && pl.hiddenflg == true) {
                            pl.salespriceR = '0.00';
                        }
                        cl.add(pl);
                    }

                    lineNo++;
                    // 最多显示100条
                    if (lineNo >= 100) {
                        break;
                    }
                }
            }
        }   

        return null;
    }

    public static Boolean IfspecialDealer(String oppDealerId){
        if (String.isBlank(oppDealerId)) {
            return false;
        }
        //return StaticParameter.specialDealerMap.containsKey(oppDealerId.substring(0,15));
        return StaticParameter.specialDealerMap.containsKey(oppDealerId.substring(0,15)) && UserInfo.getUserType() == 'PowerPartner';
    }

    public class ProductLine {
        public Integer idx {get; set;}
        public Product_Search__c pbe {get; set;}
        public String pbeId {get; set;}
        public String pbId {get; set;}
        public String salesprice {get; set;}
        public String salespriceA {get; set;}
        public String salespriceB {get; set;}
        public String salespriceC {get; set;}
        public boolean hiddenflg {get; set;}
        public String salespriceR {get; set;}
        
        public ProductLine(Integer i, Product_Search__c pbe, String pbeId, String salespriceStr, String salespriceAStr, String salespriceBStr, String salespriceCStr, String pbId, boolean flag) {
            this.idx = i;
            this.pbe = pbe;
            this.pbeId = pbeId;
            this.pbId = pbId;
            System.debug('pbeId=======>' +i+'==' + pbeId);
            this.salesprice = salespriceStr;
            this.salespriceA = salespriceAStr;
            this.salespriceB = salespriceBStr;
            this.salespriceC = salespriceCStr;
            this.hiddenflg = flag;
            this.salespriceR = salespriceStr;
        }
    }
}