public with sharing class SpecialDiscountController {
    public String accountId { get; set; }
    //public List<product2Info> productInfoList = new List<product2Info>();
    public List<product2Info> productInfoListview { get; set; }
    public Account acc { get; set; }
    public Dealer_Product__c dpc { get; set; }
    public Boolean Pro2DealerFlag {get ; set;}
    public Integer productRecoedsCount { get; set; }
    //错误信息
    public String alertMessage {set;get;}
    //
    public Boolean productSearch;

    //page
    Public Integer pagesize{get; set;} 
    Public Integer totalcount{get; set;} 
    Public Integer pagecount{get; set;} 
    Public Integer currentpage{get; set;} 
    public Boolean hasPrevious{get; set;}
    public Boolean hasNext{get; set;}

    Map<Id,Dealer_Product__c> ExistProdSDMap = new Map<Id,Dealer_Product__c> ();

    //1-5分类选项
    public String keyword { get; set; }
    public String category1 { get; set; }
    public String category2 { get; set; }
    public String category3 { get; set; }
    public String category4 { get; set; }
    public String category5 { get; set; }
    public String SpecialDiscount{ get; set; }
    public List<SelectOption> category1OptionList{get;set;}
    public List<SelectOption> category2OptionList{get;set;}
    public List<SelectOption> category3OptionList{get;set;}
    public List<SelectOption> category4OptionList{get;set;}
    public List<SelectOption> category5OptionList{get;set;}

    public SpecialDiscountController() {
        productSearch = false;
        accountId = ApexPages.currentPage().getParameters().get('userid');
        //page
        pagesize = Integer.valueof(system.label.orderdetLimitsize);
        currentpage = 0;
    }

    public void init(){
        geCategory();
        acc = [SELECT Id,Name,Parent.Name,Parent.Management_Code__c FROM Account WHERE Id = :accountId];
        ExistProdSDMap = new Map<Id,Dealer_Product__c>();
        List<product2Info> productInfoList = new List<product2Info>();
        productInfoListview = new List<product2Info>();
        dpc = new Dealer_Product__c();

        Pro2DealerFlag = false;

        //所有的产品
        List<Product2__c> product2Selected  = [select Id, Name,Name__c,Asset_Model_No__c,Category1__c,Category2__c,Category3__c,Category4__c,Category5__c,SFDA_Status__c FROM Product2__c where Estimation_Entry_Possibility__c = '○' order by Name__c ];
        for (Integer i = 0; i < product2Selected.size(); i++) {
            productInfoList.add(new product2Info(product2Selected[i]));
        }

        //已存在的特殊折扣
        List<Dealer_Product__c> dealerProductList = [select Id, Special_Discount__c,Dealer_Product2__c
                                    FROM Dealer_Product__c
                                    WHERE Dealer_Contact__c = :accountId
                                    AND Special_Discount__c != null];
        for(Dealer_Product__c ahlc : dealerProductList){
            ExistProdSDMap.put(ahlc.Dealer_Product2__c, ahlc);
        }

        for(product2Info prd : productInfoList){
            if(ExistProdSDMap.containsKey(prd.pro.Id)){
                //prd.check = true;
                prd.dealerPro = ExistProdSDMap.get(prd.pro.Id);
                prd.specialDiscount = ExistProdSDMap.get(prd.pro.Id).Special_Discount__c;
            }
        }
        productInfoList.sort();

        //总件数
        totalcount = productInfoList.size();
        //页数
        pagecount=(totalcount  +  pagesize  - 1) / pagesize;
        //显示第一页
        moveToFirst();
        makeCurrentPageRecords(productInfoList);
    }


    public void geCategory(){
        AggregateResult[] categoryList = [select Count(id), Category1_text__c c1c from Product2__c group by Category1_text__c];
        category1OptionList = new List<SelectOption>();
        category1OptionList.add(new SelectOption('', '--无--'));
        for(AggregateResult category3Search : categoryList) {
            String deliverycnt = String.valueOf(category3Search.get('c1c'));
            if(String.isNotBlank(deliverycnt)){
                category1OptionList.add(new SelectOption(deliverycnt,deliverycnt));
            }
        }
        category2OptionList = new List<SelectOption>();
        category2OptionList.add(new SelectOption('', '--无--'));
        category3OptionList = new List<SelectOption>();
        category3OptionList.add(new SelectOption('', '--无--'));
        category4OptionList = new List<SelectOption>();
        category4OptionList.add(new SelectOption('', '--无--'));
        category5OptionList = new List<SelectOption>();
        category5OptionList.add(new SelectOption('', '--无--'));
    }

    public void showcategory2() {
        AggregateResult[] categoryList = [select Count(id), Category2_text__c c2c from Product2__c WHERE Category1_text__c = :category1  group by Category2_text__c];
        category2OptionList = new List<SelectOption>();
        category2OptionList.add(new SelectOption('', '--无--'));
        for(AggregateResult category3Search : categoryList) {
            String deliverycnt = String.valueOf(category3Search.get('c2c'));
            if(String.isNotBlank(deliverycnt)){
                category2OptionList.add(new SelectOption(deliverycnt,deliverycnt));
            }
        }

    }

    public void showcategory3() {
        AggregateResult[] categoryList = [select Count(id), Category3_text__c c3c from Product2__c WHERE Category1_text__c = :category1 AND Category2_text__c = :category2  group by Category3_text__c];
        category3OptionList = new List<SelectOption>();
        category3OptionList.add(new SelectOption('', '--无--'));
        for(AggregateResult category3Search : categoryList) {
            String deliverycnt = String.valueOf(category3Search.get('c3c'));
            if(String.isNotBlank(deliverycnt)){
                category3OptionList.add(new SelectOption(deliverycnt,deliverycnt));
            }
        }

    }
    public void showcategory4() {
        AggregateResult[] categoryList = [select Count(id), Category4_text__c c4c from Product2__c WHERE Category1_text__c = :category1 AND Category2_text__c = :category2 AND Category3_text__c = :category3  group by Category4_text__c];
        category4OptionList = new List<SelectOption>();
        category4OptionList.add(new SelectOption('', '--无--'));
        for(AggregateResult category3Search : categoryList) {
            String deliverycnt = String.valueOf(category3Search.get('c4c'));
            if(String.isNotBlank(deliverycnt)){
                category4OptionList.add(new SelectOption(deliverycnt,deliverycnt));
            }
        }

    }
    public void showcategory5() {
        AggregateResult[] categoryList = [select Count(id), Category5_text__c c5c from Product2__c WHERE Category1_text__c = :category1 AND Category2_text__c = :category2 AND Category3_text__c = :category3 AND Category4_text__c = :category4  group by Category5_text__c];
        category5OptionList = new List<SelectOption>();
        category5OptionList.add(new SelectOption('', '--无--'));
        for(AggregateResult category3Search : categoryList) {
            String deliverycnt = String.valueOf(category3Search.get('c5c'));
            if(String.isNotBlank(deliverycnt)){
                category5OptionList.add(new SelectOption(deliverycnt,deliverycnt));
            }
        }

    }

    public PageReference save() {
        List<Dealer_Product__c> Ins = new List<Dealer_Product__c>();
        List<Dealer_Product__c> Del = new List<Dealer_Product__c>();
        alertMessage = '';
        Savepoint sp = Database.setSavepoint();
        try{
            for(product2Info proinfo:productInfoListview){
                if(proinfo.check == true){
                    if(proinfo.dealerPro.Special_discount__c != null  && 
                        (proinfo.dealerPro.Special_discount__c <=0 || proinfo.dealerPro.Special_discount__c >=100)){
                        proinfo.dealerPro.Special_discount__c.addError('百分比无效，请输入0~100的数字。');
                        return null;
                    }
                    Dealer_Product__c dpc = new Dealer_Product__c();
                    dpc.Id = proinfo.dealerPro.Id;
                    dpc.Dealer_Contact__c = accountId;
                    dpc.Dealer_Product2__c = proinfo.pro.Id;

                    if(proinfo.dealerPro.Special_Discount__c != null && proinfo.dealerPro.Special_Discount__c > 0){
                        dpc.Special_Discount__c = proinfo.dealerPro.Special_Discount__c;
                        Ins.add(dpc);
                    }
                    else{
                        if(proinfo.dealerPro.Id != null){
                            Del.add(dpc);
                        }



                        /*List<Dealer_Product__c> results = [select Id, Special_Discount__c,Dealer_Product2__c
                                    FROM Dealer_Product__c
                                    WHERE id = :proinfo.dealerPro.Id];
                        if (results !=null && results.size()>0) Del.add(dpc);*/
                    }
                }
                else{
                    if(proinfo.dealerPro.Special_Discount__c == null || proinfo.dealerPro.Special_Discount__c==0){
                        if(proinfo.dealerPro.id != null){
                            Dealer_Product__c dpc = new Dealer_Product__c();
                            dpc.Id = proinfo.dealerPro.Id;
                            dpc.Dealer_Contact__c = accountId;
                            dpc.Dealer_Product2__c = proinfo.pro.Id;
                            Del.add(dpc);
                        }


                        //101 sql 对应注释
                        /*List<Dealer_Product__c> results = [select Id, Special_Discount__c,Dealer_Product2__c
                                    FROM Dealer_Product__c
                                    WHERE id = :proinfo.dealerPro.Id];
                        if (results !=null && results.size()>0){
                             Dealer_Product__c dpc = new Dealer_Product__c();
                             dpc.Id = proinfo.dealerPro.Id;
                             dpc.Dealer_Contact__c = accountId;
                            dpc.Dealer_Product2__c = proinfo.pro.Id;
                            Del.add(dpc);
                        }*/
                    }
                }
            }
            /*if(Del.size()>0){
                ApexPages.addmessage(new ApexPages.message(ApexPages.severity.WARNING, 'Del' + Del));
                return null;
                delete Del;
            }*/

            if(Ins.size()>0){
                upsert Ins;
            }

            if(Del.size()>0){
                delete Del;
            }
            //alertMessage = '保存成功。';
        }catch(Exception e){
            ApexPages.addMessages(e);
            Database.rollback(sp);
            return  null;
        }
        return setpage();
        //return null;

    }

    public PageReference setpage(){
        PageReference ref = new Pagereference('/' + acc.Id);
        ref.setRedirect(true);
        return ref;
    }

    // 检索
    public void searchProduct() {
        productSearch = true;
        //所有的产品
        List<product2Info> productInfoList = new List<product2Info>();
        //检索产品
        String soql = this.makeSoql(category1,category2,category3,category4,category5,keyword,Pro2DealerFlag);
        List<Product2__c> product2Selected = Database.query(soql);
        for (Integer i = 0; i < product2Selected.size(); i++) {
            productInfoList.add(new product2Info(product2Selected[i]));
        }

        //已存在的特殊折扣
        ExistProdSDMap.clear();
        List<Dealer_Product__c> DealerProductList = [select Id, Special_Discount__c,Dealer_Product2__c
                                    FROM Dealer_Product__c
                                    WHERE Dealer_Contact__c = :accountId
                                    AND Special_Discount__c != null];
        for(Dealer_Product__c ahlc : dealerProductList){
            ExistProdSDMap.put(ahlc.Dealer_Product2__c, ahlc);
        }

        for(product2Info prd : productInfoList){
            if(ExistProdSDMap.containsKey(prd.pro.Id)){
                //prd.check = true;
                prd.dealerPro = ExistProdSDMap.get(prd.pro.Id);
                prd.specialDiscount = ExistProdSDMap.get(prd.pro.Id).Special_Discount__c;
            }
        }
        productInfoList.sort();

        //总件数
        totalcount = productInfoList.size();
        //页数
        pagecount=(totalcount  +  pagesize  - 1) / pagesize; 
        //显示第一页
        moveToFirst();
        makeCurrentPageRecords(productInfoList);
    }

    //产品检索
    public String makeSoql(String category1,String category2,String category3,String category4,String category5,String keyword,Boolean Pro2DealerFlag){
        String soql = 'select Id, Name,Name__c,Asset_Model_No__c,Category1__c,Category2__c,Category3__c,Category4__c,';
        soql += ' Category5__c,SFDA_Status__c FROM Product2__c WHERE Estimation_Entry_Possibility__c = \'○\'';
        if(String.isNotBlank(category1)){
            soql += ' AND Category1__c = \'' +  category1 + '\'';
        }
        if(String.isNotBlank(category2)){
            soql += ' AND Category2__c = \'' +  category2 + '\'';
        }
        if(String.isNotBlank(category3)){
            soql += ' AND Category3__c = \'' +  category3 + '\'';
        }
        if(String.isNotBlank(category4)){
            soql += ' AND Category4__c = \'' +  category4 + '\'';
        }
        if(String.isNotBlank(category5)){
            soql += ' AND Category5__c = \'' +  category5 + '\'';
        }
        if(String.isNotBlank(keyword)){
            soql += ' AND Name__c like \'%' + String.escapeSingleQuotes(keyword.replaceAll('%', '\\%')) + '%\'';
        }
        if(Pro2DealerFlag){
            soql += ' AND Pro2_Dealer_Object__c = true';
        }
        soql += ' order by Name__c ';

        return soql;
    }

    //首页
    public void moveToFirst(){
        if(currentpage == 1) return;
        currentpage = 1;
        canMove();
    }

    //尾页
    public void moveToLast(){
        if(currentpage >= pagecount) return;
        currentpage = pagecount;
        canMove();
    }

    //上一页
    public void moveToPrevious(){
        if(currentpage == 1) return;
        currentpage = currentpage -1;
        canMove();
    }

    //下一页
    public void moveToNext(){
        if(currentpage >= pagecount) return;

        currentpage = currentpage + 1;
        canMove();
    }

    //判断是否可翻页
    public void canMove(){
        hasPrevious = false;
        hasNext = false;
        if(pagecount > 1 && currentpage > 1) hasPrevious = true;
        if(pagecount > 1 && currentpage < pagecount)  hasNext = true;
    }

    //获取所有产品
    public List<product2Info> searchAllProduct(){
        //所有的产品
        List<product2Info> allProductList = new List<product2Info>();
        List<Product2__c> accountInfo = [select Id, Name,
                                                Name__c,
                                                Asset_Model_No__c,
                                                Category1__c,
                                                Category2__c,
                                                Category3__c,
                                                Category4__c,
                                                Category5__c,
                                                SFDA_Status__c
                                            FROM Product2__c
                                            where Estimation_Entry_Possibility__c = '○'
                                            order by Name__c];
        for (Integer i = 0; i < accountInfo.size(); i++) {
            allProductList.add(new product2Info(accountInfo[i]));
        }
        return allProductList;
    }

    //刷新当前页
    public PageReference refreshPageSize() {
        //所有的产品
        List<product2Info> productInfoList = new List<product2Info>();
        //if(productSearch){
            //检索产品
            String soql = this.makeSoql(category1,category2,category3,category4,category5,keyword,Pro2DealerFlag);
            List<Product2__c> product2Selected = Database.query(soql);
            for (Integer i = 0; i < product2Selected.size(); i++) {
                productInfoList.add(new product2Info(product2Selected[i]));
            }

            //已存在的特殊折扣
            ExistProdSDMap.clear();
            List<Dealer_Product__c> DealerProductList = [select Id, Special_Discount__c,Dealer_Product2__c
                                        FROM Dealer_Product__c
                                        WHERE Dealer_Contact__c = :accountId
                                        AND Special_Discount__c != null];
            for(Dealer_Product__c ahlc : dealerProductList){
                ExistProdSDMap.put(ahlc.Dealer_Product2__c, ahlc);
            }

            for(product2Info prd : productInfoList){
                if(ExistProdSDMap.containsKey(prd.pro.Id)){
                    prd.dealerPro = ExistProdSDMap.get(prd.pro.Id);
                    prd.specialDiscount = ExistProdSDMap.get(prd.pro.Id).Special_Discount__c;
                }
            }
        /*}else{
            productInfoList = searchAllProduct();
            //已存在的产品促销信息
                if(nowContactMap.size() > 0){
                    List<Dealer_Product__c> dealerProductList = [select Id, Dealer_Product2__c,Dealer_Contact__c,
                                                                Special_Campaign_Price__c,Campaign_StartDate__c,
                                                                Campaign_EndDate__c,OrderGoods_Limit__c
                                                            FROM Dealer_Product__c
                                                            WHERE Dealer_Contact__c in :nowContactMap.keySet()
                                                            AND Promotion_No__c = :recordId];
                    for(Dealer_Product__c ahlc : dealerProductList){
                        existRecordsMap.put('' + ahlc.Dealer_Contact__c + ahlc.Dealer_Product2__c,ahlc);
                        agencyedHospitalMap.put(ahlc.Dealer_Product2__c, ahlc);
                    }
                    for(product2Info prd : productInfoList){
                        if(agencyedHospitalMap.containsKey(prd.pro.Id)){
                            //prd.check = true;
                            prd.dealerPro = agencyedHospitalMap.get(prd.pro.Id);
                        }
                    }
                }
        }*/
        productInfoList.sort();
        //总件数
        totalcount = productInfoList.size();
        //页数
        pagecount=(totalcount  +  pagesize  - 1) / pagesize;
        makeCurrentPageRecords(productInfoList);
        return null;
    }

    //编辑当前页内容
    public void makeCurrentPageRecords(List<product2Info> productInfoList){
        Integer startIdx;
        Integer endIdx;
        productInfoListview = new List<product2Info>();
/*
        List<product2Info> reSet = new List<product2Info>();
        Map<String, String> selectedIdMap = new Map<String, String>();
        for(product2Info prd : productInfoListview){
            if(prd.check == true){
                selectedIdMap.put(prd.pro.Id,prd.pro.Id);
                reSet.add(prd);
            }
        }

        if(reSet.size() > 0){
            productInfoListview = reSet;
        }
*/
        startIdx = (currentpage-1) * pagesize;
        endIdx = (currentpage-1) * pagesize+ pagesize;
        if (endIdx > productInfoList.size()){
            endIdx = productInfoList.size();
        } 

        for(Integer i=startIdx; i < endIdx ; i++){
            //if(selectedIdMap.containsKey(productInfoList.get(i).pro.Id)){
            //    continue;
            //}
            //else{
                productInfoListview.add(productInfoList.get(i));
            //}
        }

        productRecoedsCount = productInfoListview.size();

   }


    class product2Info implements Comparable {
        public Boolean check { get; set; }
        public Decimal specialDiscount { get; set; }
        public Product2__c pro { get; set; }
        public Dealer_Product__c dealerPro { get; set; }

        public product2Info(Product2__c e) {
            check = false;
            pro = e;
            dealerPro = new Dealer_Product__c();
            specialDiscount = null;
        }

        public Integer compareTo(Object compareTo) {
            product2Info compareToesd =(product2Info)compareTo;
            Integer returnValue = 0;
            if(check == true){
                returnValue = -1;
            }else{
                if (specialDiscount == null){
                    returnValue = 1;
                }else{
                    if (specialDiscount > compareToesd.specialDiscount) {
                        returnValue = -1;
                    } else if (specialDiscount < compareToesd.specialDiscount) {
                        returnValue = 1;
                    }
                }
            }
            return returnValue;
        }
    }
}