public with sharing class LexNewAndEditLeadPIPLController {
    public static Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe();
    // 字段信息
    public static Map<string, SObjectField> fieldMap = new Map<string, SObjectField>();

    @AuraEnabled
    public static ResponseBodyLWC initData2(Id rid, String recordTypeId, String sobjectType) {
        System.debug('测试 initData2');
        return new ResponseBodyLWC('Error', 500, '测试', '');
    }
    @AuraEnabled
    public static ResponseBodyLWC initData(Id rid, String recordTypeId, String sobjectType) {
        try {
            System.debug('rid = ' + rid);
            System.debug('recordTypeId = ' + recordTypeId);
            System.debug('sobjectType = ' + sobjectType);
            fieldMap = schemaMap.get(sobjectType).getDescribe().fields.getMap();
            ResponseBodyLWC res = new ResponseBodyLWC();
            Map<String, object> data = new Map<String, object>();
            res.entity = data;
            List<Metadata.LayoutSection> layout = null;
            data.put('recordTypeId', '');
            if (String.isEmpty(recordTypeId)) {
                data.put('recordTypeId', LayoutDescriberHelper.getDefaultRecordType(sobjectType));
                recordTypeId = LayoutDescriberHelper.getDefaultRecordType(sobjectType);
                System.debug('recordTypeId = ' + recordTypeId);
            } else {
                data.put('recordTypeId', recordTypeId);
            }
            LayoutDescriberHelper.LayoutWrapper LayoutWrapperValue = LayoutDescriberHelper.describeSectionWithFieldsWrapper(recordTypeId,'Lead','lightning');
            List<LayoutDescriberHelper.LayoutSection> layoutSections = LayoutWrapperValue.layoutSections;
            data.put('layout', Json.serialize(layoutSections));
            //编辑
            if(!String.isBlank(rid)){
                //获取对应对象的字段
                List<Sobject> lso = Database.query('select id from RecordType where SobjectType = :sobjectType');
                string sql = 'select Contact_Name__r.LastName,Contact_Name__r.AWS_Data_Id__c,Hospital_Name__r.Id';
                DescribeSObjectResult objectType = rid.getSobjectType().getDescribe();
                List<String> objectFields = new List<String>(objectType.fields.getMap().keySet());
                sql += ', ' + String.join(objectFields, ',') +' from '+sobjectType+' where id =\''+rid+'\' limit 1';
                System.debug('sql = ' + sql);
                Sobject leadData = Database.query(sql);
                if(leadData == null){
                    return new ResponseBodyLWC('Error',500, 'id不存在', '');
                }
                data.put('recordTypeId', (String)leadData.get('RecordTypeId'));
                data.put('AWSDataId', (String)leadData.get('AWS_Data_Id__c'));
                //获取值
                System.debug('leadData = ' + JSON.serialize(leadData));
                data.put('data', leadData);
            }
            //获取PI字段
            PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo(sobjectType);
            Map<String, String> AWSToSobjectNonEncryptedMap = new Map<String, String>();
            List<String> AWSToSobjectNonEncryptedMapKeySet = new List<String>();
            for (PI_Field_Policy_Detail__c PIDetail : piIntegration.PIDetails) {
                AWSToSobjectNonEncryptedMap.put(PIDetail.AWS_Field_API__c, PIDetail.SF_Field_API_Name__c);
                AWSToSobjectNonEncryptedMapKeySet.add(PIDetail.AWS_Field_API__c);
            }
            data.put('AWSToSobjectNonEncryptedMap', AWSToSobjectNonEncryptedMap);
            data.put('AWSToSobjectNonEncryptedMapKeySet', AWSToSobjectNonEncryptedMapKeySet);
            data.put('staticResource', Json.serialize(PIHelper.getPIIntegrationInfo(sobjectType)));
            data.put('staticResourceContact', Json.serialize(PIHelper.getPIIntegrationInfo('Contact')));
            res.status = 'Success';
            res.code = 200;
            res.msg = '';
            return res;
        } catch (Exception e) {
            System.debug('error = ' + e.getMessage() + ' line = ' + e.getLineNumber());
            return new ResponseBodyLWC('Error', 500, e.getMessage() + ' ' + e.getLineNumber(), '');
        }
    }

    @AuraEnabled
    public static ResponseBodyLWC queryAccount(String accountTypes, String accountId) {
        ResponseBodyLWC res = new ResponseBodyLWC();
        Map<String, object> data = new Map<String, object>();
        res.entity = data;
        System.debug('accountType = ' + accountTypes);
        System.debug('accountId = ' + accountId);
        try {
            List<Object> types = (List<Object>) JSON.deserializeUntyped(accountTypes);
            System.debug('types=' + types);
            String soql = 'select Id,Name,';
            for (Object t : types) {
                soql += (String) t + ',';
            }
            soql = soql.substring(0, soql.length() - 1);
            soql += ' from Account where id=\'' + accountId + '\'';
            System.debug('soql=' + soql);
            Sobject account = new Account();
            if (!Test.isRunningTest()) {
                account = Database.query(soql);
            } else {
                account.put('Id', '000000000000000');
            }
            Map<String, Map<String, String>> m = new Map<String, Map<String, String>>();
            System.debug('account=' + account);
            for (Object ty : types) {
                String t = (String) ty;
                if (account.get(t) != null || Test.isRunningTest()) {
                    Sobject acc = new Account();
                    if (Test.isRunningTest()) {
                        acc.put('Id', '000000000000000');
                        acc.put('Name', 'Name');
                    } else {
                        acc = Database.query('select Id,Name from Account where id=\'' + account.get(t) + '\'');
                    }
                    Map<String, String> n = new Map<String, String>();
                    n.put('Id', (String) acc.get('Id'));
                    n.put('Name', (String) acc.get('Name'));
                    m.put(t, n);
                }
            }
            System.debug('m=' + m);
            data.put('m', m);
            data.put('account', account);
            res.status = 'Success';
            res.code = 200;
            res.msg = '';
            return res;
        } catch (Exception e) {
            return new ResponseBodyLWC('Error', 500, e.getMessage() + ' ' + e.getLineNumber(), '');
        }
    }

    @AuraEnabled
    public static ResponseBodyLWC searchContactInit(String accountId, String searchKeyWord) {
        ResponseBodyLWC res = new ResponseBodyLWC();
        Map<String, object> data = new Map<String, object>();
        res.entity = data;
        System.debug('accountId = ' + accountId);
        System.debug('searchKeyWord = ' + searchKeyWord);
        try {
            List<Contact> conList = new List<Contact>();
            List<Contact> noPIContactList = new List<Contact>();
            if (checkNullString(accountId) && checkNullString(searchKeyWord)) {
                conList = new List<Contact>();
            } else {
                if (checkNullString(accountId)) {
                    conList = new List<Contact>();
                } else {
                    //2022-5-12 yjk 将科室匹配改为医院匹配查询联系人 statt
                    Account act = [SELECT id, Hospital__c FROM Account WHERE id = :accountId];
                    conList = new List<Contact>(
                        [
                            SELECT Id, AWS_Data_Id__c, Account.Name
                            FROM Contact
                            WHERE Account.Hospital__c = :act.Hospital__c AND AWS_Data_Id__c != ''
                        ]
                    );
                    noPIContactList = AWSServiceTool.getNoPIContact(searchKeyWord, accountId);
                    //2022-5-12 yjk 将科室匹配改为医院匹配查询联系人 end
                }
            }
            Map<String, Contact> awsIdToContactMap = new Map<String, Contact>();
            List<String> conAWSIds = new List<String>();
            for (Contact con : conList) {
                conAWSIds.add(con.AWS_Data_Id__c);
                awsIdToContactMap.put(con.AWS_Data_Id__c, con);
            }
            data.put('awsIdToContactMap', awsIdToContactMap);
            data.put('conAWSIds', conAWSIds);
            data.put('noPIContactList', noPIContactList);
            data.put('contactStaticResource', JSON.serialize(PIHelper.getPIIntegrationInfo('Contact')));
            res.status = 'Success';
            res.code = 200;
            res.msg = '';
            return res;
        } catch (Exception e) {
            return new ResponseBodyLWC('Error', 500, e.getMessage() + ' ' + e.getLineNumber(), '');
        }
    }

    public static Boolean checkNullString(String inputString) {
        if (String.isEmpty(inputString) || String.isBlank(inputString)) {
            return true;
        }
        return false;
    }

    /**
     *@description 转换layout
     *@param	sections                        默认metalayout
     *@return	List<Metadata.LayoutSection>	标准metalayout
     */
    public static List<Metadata.LayoutSection> reviseMetaLayouts(List<Metadata.LayoutSection> sections) {
        List<Metadata.LayoutSection> result = new List<Metadata.LayoutSection>();
        if (sections == null) {
            return null;
        }
        for (Metadata.LayoutSection s : sections) {
            Metadata.LayoutSection section = new Metadata.LayoutSection();
            section.customLabel = s.customLabel;
            section.detailHeading = s.detailHeading;
            section.editHeading = s.editHeading;
            section.label = s.label;
            section.style = s.style;
            result.add(section);
            for (Metadata.LayoutColumn c : s.layoutColumns) {
                if (c.layoutItems == null) {
                    break;
                }
                Metadata.LayoutColumn col = new Metadata.LayoutColumn();
                col.reserved = col.reserved;
                section.layoutColumns.add(col);
                for (Metadata.layoutItem item : c.layoutItems) {
                    if (!fieldMap.containsKey(item.field) || !isUpdateable(fieldMap.get(item.field).getDescribe())) {
                        System.debug(item.field);
                        continue;
                    }
                    col.layoutItems.add(item);
                }
            }
        }
        return result;
    }

    private static Boolean isUpdateable(Schema.DescribeFieldResult dfr) {
        return (new List<String>{ 'Id', 'Name' }).contains(dfr.getName()) || dfr.isUpdateable();
    }
}