1/**
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import HiLog from '../utils/HiLog';
17import common from '../data/commonData';
18import telephoneUtil from '../utils/TelephoneUtil';
19import LooseObject from '../data/LooseObject'
20
21const TAG = 'ContractService';
22
23export default {
24
25    /**
26     * Querying the contact list
27     *
28     * @param actionData
29     * @callback callback
30     */
31    queryContact(actionData, callback) {
32        // Obtain rawContractIds and query contacts.
33        globalThis.DataWorker.sendRequest('queryContact', {
34            actionData: actionData,
35            context: globalThis.mmsContext
36        }, rawContractIds => {
37            let result: LooseObject = {};
38            actionData.contractIds = rawContractIds;
39            globalThis.DataWorker.sendRequest('queryContactDataByIds', {
40                actionData: actionData,
41                context: globalThis.mmsContext
42            }, contracts => {
43                result.code = common.int.SUCCESS;
44                this.convertContracts(contracts, messageList => {
45                    result.response = messageList;
46                    callback(result);
47                });
48            });
49        });
50    },
51
52    /**
53     * Counting the number of rows of contacts
54     *
55     * @param actionData
56     * @callback callback
57     */
58    countContact(actionData, callback) {
59        // Obtain rawContractIds and query contacts.
60        globalThis.DataWorker.sendRequest('countContact', {
61            actionData: actionData,
62            context: globalThis.mmsContext
63        }, count => {
64            let result: LooseObject = {};
65            result.code = common.int.SUCCESS;
66            result.response = count;
67            callback(result);
68        });
69    },
70
71    /**
72     * Convert contact parameters
73     *
74     * @param contracts
75     * @callback callback
76     */
77    async convertContracts(contracts, callback) {
78        let messageList = [];
79        for (let contract of contracts) {
80            let item: LooseObject = {};
81            item.contactName = contract.displayName;
82            item.headImage = 'icon/user_avatar_full_fill.svg';
83            item.telephone = contract.detailInfo;
84            item.telephoneFormat = contract.detailInfo;
85            item.select = false;
86            messageList.push(item);
87        }
88        callback(messageList);
89    },
90
91    /**
92     * Process contact parameters
93     *
94     * @param contactObjects
95     */
96    dealContractParams(contactObjects): LooseObject {
97        let contractParams: LooseObject = {};
98        if (contactObjects && contactObjects != common.string.EMPTY_STR) {
99            let params: Array<LooseObject> = [];
100            try {
101                params = JSON.parse(contactObjects);
102            } catch (Error) {
103                HiLog.i(TAG, `JSON.parse error ${Error}`);
104                return contractParams;
105            }
106            let contactsNumber: string = common.string.EMPTY_STR;
107            let contactsName: string = common.string.EMPTY_STR;
108            let contactsNumberFormat: string = common.string.EMPTY_STR;
109            let length: number = params.length;
110            for (let item of params) {
111                contactsNumber = contactsNumber + item.telephone + common.string.COMMA;
112                contactsNumberFormat = contactsNumberFormat + item.telephone + common.string.COMMA;
113                if (item.contactsName) {
114                    contactsName += (item.contactsName + common.string.COMMA);
115                } else if (length > 1) {
116                    contactsName += (item.telephone + common.string.COMMA);
117                }
118            }
119            let telephone: string = contactsNumber.substring(0, contactsNumber.length - 1);
120            contactsNumber = telephoneUtil.dealTelephoneSort(telephone);
121            contractParams.strContactsNumber = contactsNumber;
122            contractParams.strContactsNumberFormat = contactsNumber;
123            contractParams.strContactsName = contactsName.substring(0, contactsName.length - 1);
124            contractParams.contactsNum = length;
125        }
126        return contractParams;
127    },
128
129    /**
130     * Query a contact by mobile number.
131     *
132     * @param actionData
133     * @callback callback
134     */
135    queryContactDataByTelephone(actionData, callback) {
136        globalThis.DataWorker.sendRequest('queryContactDataByTelephone', {
137            actionData: actionData,
138            context: globalThis.mmsContext
139        }, contracts => {
140            callback(contracts);
141        });
142    },
143
144    /**
145     * Fuzzy search for contacts
146     *
147     * @param actionData
148     * @callback callback
149     */
150    searchContracts(actionData, callback) {
151        let result: LooseObject = {};
152        globalThis.DataWorker.sendRequest('searchContracts', {
153            actionData: actionData,
154            context: globalThis.mmsContext
155        }, (res) =>{
156            result.code = res.code
157            if (res.code == common.int.SUCCESS) {
158                result.response = this.dealSearchContracts(res.abilityResult);
159                callback(result);
160            }
161        });
162    },
163
164    dealSearchContracts(contracts) {
165        let searchContracts = []
166        for (let item of contracts) {
167            let searchContract: LooseObject = {};
168            searchContract.headImage = 'icon/user_avatar_full_fill.svg';
169            searchContract.contactName = item.displayName;
170            searchContract.telephone = item.detailInfo;
171            searchContract.telephoneFormat = item.detailInfo;
172            searchContracts.push(searchContract);
173        }
174        return searchContracts;
175    },
176
177    /**
178     * Check whether a business card exists.
179     *
180     * @param actionData
181     * @callback callback
182     */
183    judgeIsExitProfile(actionData, callback) {
184        globalThis.DataWorker.sendRequest('queryProfile', {
185            actionData: actionData,
186            context: globalThis.mmsContext
187        }, res => {
188            let result = false;
189            if (res > 0) {
190                result = true;
191            }
192            callback(result);
193        });
194    }
195}