public without sharing class  eSignAgencyConfirmPageController {
    //Get Account Records
    @AuraEnabled
    public static eSignWrapper geteSigns(String DNName){
        // 最多只显示200条明细数据
        List<eSignFormLineItem__c> eSignFormLineItems =
            [SELECT Id, OTCode__c, Name,
            Asset_Model_No__c ,
            productName__c,
            Count_Text__c,
            GoodStatus__c,
            agencyGoodStatus__c,
            // handleOpinion__c,
            agencyConfirmResult__c
            ,
            CaseNumber__c
            FROM eSignFormLineItem__c
            where eSignForm__r.DNNameNo0__c =: DNName
            order by CaseNumber__c asc
                // and handleOpinion__c != null
                ];
        system.debug('eSignFormLineItems:'+eSignFormLineItems);
        eSignForm__c eSignForm  =
            [SELECT Id, Name, supplier__c,
             supplierNo__c, ContractNO__c, shippingUnit__c,
             shippingAddress__c,DNNameNo0__c, contactName__c,
             contactNumber__c, DeliveryDate__c, endUserName__c,
             totalNumber__c, transportMode__c, totalWeight__c,handleOpinionAgency__c
             // ,GoodDetails__c, weight__c
                FROM eSignForm__c
                where DNNameNo0__c =: DNName];
        eSignWrapper eSignWrapper = new eSignWrapper();
        eSignWrapper.eSignFormLineItems =
            loadeSignFormEntry(eSignFormLineItems, '经销商收货', eSignForm.ID );
        eSignWrapper.eSignForm = loadeSignForm(eSignForm,'经销商收货',eSignForm.ID);
        return eSignWrapper;
    }

// Date HPScanDay,Date HPSignUpDate,
    @AuraEnabled
    public static saveeSignFormEntryResult saveeSignFormEntry(
        list<eSignFormLineItem__c> eSignFormLineItems, eSignForm__c eSignForm
        , string entryType, boolean IsSubmit,
        Date agencyScanDayBack,Date agencySignUpDateBack,
        Date salesHPManageFBDate,Date salesHPManageConfirmDate,Date HPConfirmDate,String AgencyWorkflowEmailBack){
            saveeSignFormEntryResult tempResult = new saveeSignFormEntryResult();
        try{
            eSignFormEntry__c tempeSignFormEntry = new eSignFormEntry__c();

            List<eSignFormEntry__c> lastESignFormEntryList = [select id,agencyScanDayBack__c,agencySignUpDateBack__c,agencyConfirmDateBack__c,
            HPScanDayBack__c,HPSignUpDateBack__c,IsSubmit__c,IsHPSubmit__c,AgencyWorkflowEmailBack__c,HPWorkflowEmailBack__c,AgencyWorkflowEmail__c,HPWorkflowEmail__c,HPSignUpStatus__c,agencyReject__c,HPReject__c,IsAgencyScan__c,IsHPScan__c,IsHandled__c  
                from eSignFormEntry__c
                where eSignForm__c = :eSignForm.ID
                order by createddate desc limit 1];

            if(lastESignFormEntryList.size()>0){
                //经销商扫描日
                tempeSignFormEntry.agencyScanDayBack__c = lastESignFormEntryList[0].agencyScanDayBack__c;
                //经销商签收日
                tempeSignFormEntry.agencySignUpDateBack__c = lastESignFormEntryList[0].agencySignUpDateBack__c;

                //医院扫描日
                tempeSignFormEntry.HPScanDayBack__c = lastESignFormEntryList[0].HPScanDayBack__c;
                //医院签收日
                tempeSignFormEntry.HPSignUpDateBack__c = lastESignFormEntryList[0].HPSignUpDateBack__c;
                //经销商是否提交
                tempeSignFormEntry.IsSubmit__c = lastESignFormEntryList[0].IsSubmit__c;
                //医院是否提交
                tempeSignFormEntry.IsHPSubmit__c = lastESignFormEntryList[0].IsHPSubmit__c;
                //经销商是否扫描
                tempeSignFormEntry.IsAgencyScan__c = lastESignFormEntryList[0].IsAgencyScan__c;
                //经销商邮箱
                tempeSignFormEntry.AgencyWorkflowEmailBack__c = lastESignFormEntryList[0].AgencyWorkflowEmail__c;
                //医院邮箱
                tempeSignFormEntry.HPWorkflowEmailBack__c = lastESignFormEntryList[0].HPWorkflowEmailBack__c;

                //如果上一条医院已处理，但是签收单被驳回了，那么经销商签收的中间表就不应该有这两个医院的勾
                //其它情况都应该带着
                if(lastESignFormEntryList[0].IsHandled__c && lastESignFormEntryList[0].HPSignUpStatus__c == '不批准'){
                    tempeSignFormEntry.IsHPSubmit__c = false;
                    tempeSignFormEntry.IsHPScan__c = false;
                }else{
                    tempeSignFormEntry.IsHPSubmit__c = lastESignFormEntryList[0].IsHPSubmit__c;
                    tempeSignFormEntry.IsHPScan__c = lastESignFormEntryList[0].IsHPScan__c;
                }
            }



            //经销商确认日
            tempeSignFormEntry.agencyConfirmDateBack__c =  Date.today();
            tempeSignFormEntry.Name = eSignForm.Name + '-' + entryType;
            tempeSignFormEntry.entryType__c = entryType;
            tempeSignFormEntry.eSignForm__c = eSignForm.ID;
           
            

            // //医院扫描日
            // tempeSignFormEntry.HPScanDayBack__c = HPScanDay;
            // //医院签收日
            // tempeSignFormEntry.HPSignUpDateBack__c =  HPSignUpDate;
           

            
            insert tempeSignFormEntry;
            list<eSignFormLineItemEntry__c> eSignFormLineItemEntryList =
                new list<eSignFormLineItemEntry__c>();
            for(eSignFormLineItem__c tempeSignFormLineItem : eSignFormLineItems){
                eSignFormLineItemEntry__c tempeSignFormLineItemEntry =
                    new eSignFormLineItemEntry__c();
                tempeSignFormLineItemEntry.eSignFormEntry__c =  tempeSignFormEntry.id;
                tempeSignFormLineItemEntry.Name =  tempeSignFormLineItem.Name;
                tempeSignFormLineItemEntry.eSignFormLineItem__c =  tempeSignFormLineItem.id;
                tempeSignFormLineItemEntry.agencyConfirmResult__c =  tempeSignFormLineItem.agencyConfirmResult__c;
                //确认页也需要更新经销商货物情况
                tempeSignFormLineItemEntry.agencyGoodStatus__c = tempeSignFormLineItem.agencyGoodStatus__c;
                tempeSignFormLineItemEntry.HPGoodStatus__c = tempeSignFormLineItem.HPGoodStatus__c;
                //如果医院货物情况为完好，默认赋值为同意
                if(tempeSignFormLineItem.agencyGoodStatus__c == '完好'){
                    tempeSignFormLineItemEntry.agencyConfirmResult__c = '同意';
                }
                eSignFormLineItemEntryList.add(tempeSignFormLineItemEntry);
            }
            if(eSignFormLineItemEntryList.size() > 0 ){
                insert eSignFormLineItemEntryList;
            }
            tempResult.isSuccess = true;
            tempResult.result = tempeSignFormEntry.id;

            List<eSignFormEntry__c> backHomeList = [SELECT Id,DNNameNo0__c,agencyDNSignUpStatus__c,HPDNSignUpStatus__c,agencySignUpDate__c 
                FROM eSignFormEntry__c
                where id =: tempeSignFormEntry.id
                order by createddate desc];
            tempResult.agencyDNSignUpStatus =backHomeList[0].agencyDNSignUpStatus__c;
            tempResult.HPDNSignUpStatus =backHomeList[0].HPDNSignUpStatus__c;
            tempResult.agencySubmit = backHomeList[0].agencySignUpDate__c;
            tempResult.DNNameSpare =backHomeList[0].DNNameNo0__c;

        }catch(Exception e){
            tempResult.result = e.getMessage();
        }

        return tempResult;
    }

    public static List<eSignFormLineItem__c> loadeSignFormEntry(
        List<eSignFormLineItem__c> eSignFormLineItems, string entryType, string eSignFormID ){
        list<eSignFormEntry__c> tempeSignFormEntryList =
            [select id
                from eSignFormEntry__c
                where eSignForm__c = :eSignFormID
                // and  entryType__c =: entryType
                order by createddate desc limit 1
            ];
        if( tempeSignFormEntryList.size() == 0){
            return eSignFormLineItems;
        }
        list<eSignFormLineItemEntry__c> eSignFormLineItemEntryList =
         [select id ,agencyConfirmResult__c,agencyGoodStatus__c,eSignFormLineItem__c,HPGoodStatus__c,CaseNumber__c 
            from eSignFormLineItemEntry__c
            where eSignFormEntry__c =: tempeSignFormEntryList[0].id
         ];
        map<ID, eSignFormLineItemEntry__c> eSignFormLineItemEntryMap =
        new map<ID, eSignFormLineItemEntry__c>();
        for( eSignFormLineItemEntry__c tempESignEntryItem : eSignFormLineItemEntryList){
            eSignFormLineItemEntryMap.put(tempESignEntryItem.eSignFormLineItem__c, tempESignEntryItem);
        }
        for( eSignFormLineItem__c tempEsignItem: eSignFormLineItems){
            eSignFormLineItemEntry__c tempESignEntryItem =
                eSignFormLineItemEntryMap.get(tempEsignItem.id);
            if(tempESignEntryItem != null){
                // tempEsignItem.CaseNumber__c = tempESignEntryItem.CaseNumber__c;
                tempEsignItem.HPGoodStatus__c = tempESignEntryItem.HPGoodStatus__c;
                if(tempESignEntryItem.agencyConfirmResult__c!= null){
                    tempEsignItem.agencyConfirmResult__c = tempESignEntryItem.agencyConfirmResult__c;
                }else{
                    tempEsignItem.agencyConfirmResult__c = '同意';
                }
            
            }
        }

        return eSignFormLineItems;
    }
    //获取上一次的录入表 主要为了获取邮箱
    public static eSignForm__c loadESignForm(eSignForm__c eSignForm,string entryType,string eSignFormID ){
        list<eSignFormEntry__c> tempeSignFormEntryList =
            [select id,AgencyWorkflowEmailBack__c
                from eSignFormEntry__c
                where eSignForm__c = :eSignFormID
                and  entryType__c =: entryType
                order by createddate desc limit 1
            ];
        if( tempeSignFormEntryList.size() > 0){
            eSignForm.AgencyWorkflowEmail__c= tempeSignFormEntryList[0].AgencyWorkflowEmailBack__c;
        }

        return eSignForm;
    }
    public class saveeSignFormEntryResult{
        @AuraEnabled
        public Boolean isSuccess;
        @AuraEnabled
        public string result;

        //经销商状态
        @AuraEnabled
        public string agencyDNSignUpStatus;
        //医院状态
        @AuraEnabled
        public string HPDNSignUpStatus;
        //是否提交
        @AuraEnabled
        public Date agencySubmit;
        //备用DN号
        @AuraEnabled
        public string DNNameSpare;

        public saveeSignFormEntryResult(){
            isSuccess = false;
            result = '';
            agencyDNSignUpStatus ='';
            HPDNSignUpStatus = '';
            agencySubmit = null;
            DNNameSpare = '';
        }
    }
    public class eSignWrapper{
        @AuraEnabled
        public List<eSignFormLineItem__c> eSignFormLineItems;

        @AuraEnabled
        public eSignForm__c eSignForm;
        public eSignWrapper(){
            eSignFormLineItems = new List<eSignFormLineItem__c>();
            eSignForm = new eSignForm__c();
        }

    }
    //文件上传
    @AuraEnabled
    public static Id saveChunk(Id parentId, String fileName, String base64Data, String contentType, String fileId) {
        // check if fileId id ''(Always blank in first chunk), then call the saveTheFile method,
        //  which is save the check data and return the attachemnt Id after insert, 
        //  next time (in else) we are call the appentTOFile() method
        //   for update the attachment with reamins chunks   
        if (fileId == '') {
            fileId = saveTheFile(parentId, fileName, base64Data, contentType);
        } else {
            appendToFile(fileId, base64Data);
        }
 
        return Id.valueOf(fileId);
    }
 
    public static Id saveTheFile(Id parentId, String fileName, String base64Data, String contentType) {
        base64Data = EncodingUtil.urlDecode(base64Data, 'UTF-8');
 
        Attachment oAttachment = new Attachment();
        oAttachment.parentId = parentId;
 
        oAttachment.Body = EncodingUtil.base64Decode(base64Data);
        oAttachment.Name = fileName;
        oAttachment.ContentType = contentType;
 
        insert oAttachment;
 
        return oAttachment.Id;
    }
 
    private static void appendToFile(Id fileId, String base64Data) {
        base64Data = EncodingUtil.urlDecode(base64Data, 'UTF-8');
 
        Attachment a = [
            SELECT Id, Body
            FROM Attachment
            WHERE Id =: fileId
        ];
 
        String existingBody = EncodingUtil.base64Encode(a.Body);
 
        a.Body = EncodingUtil.base64Decode(existingBody + base64Data);
 
        update a;
    }

    //文件删除功能  精琢技术 thh 2021-09-26 start
    @AuraEnabled
    public static void deleteChunk(Id AttachmentId) {
        Attachment attachment = new Attachment();
        attachment.id = AttachmentId;

        delete attachment;
    }
    //文件删除功能  精琢技术 thh 2021-09-26 end
}