/**
 * @description Create the Sales Order for the Shopify order
 * @param {Object} parameterObject
 * @param {Number|String} parameterObject.shopifyRecordId - The shopify integration record id
 * @param {Number|String} parameterObject.shopifyOrderId - The shopify order id
 * @param {Number|String} parameterObject.entity - The NetSuite Customer Id for the order
 * @param {String} parameterObject.cardCompany - specifies the card company
 * @param {String} parameterObject.order_date - the shopify order date
 * @param {Number|String} parameterObject.order_num - the shopify order number
 * @param {String} parameterObject.order_note - the shopify order note
 * @param {Array} parameterObject.order_line - the shopify order item lines details
 * @param {Object} parameterObject.shipping_address - the shipping address of the shopify order
 * @param {Object} parameterObject.billing_address - the billing address of the shopify order
 * @param {Array} parameterObject.shipping_lines - the shipping lines of the shopify order which contains the shipment methods details
 * @param {Array} parameterObject.discount_applications - the discount details if any
 * @returns {*|number|boolean} - Sales Order Internal ID if successful, else false
 */
createSalesOrder({
                     shopifyRecordId,
                     shopifyOrderId,
                     entity,
                     cardCompany,
                     order_date,
                     order_num,
                     order_note,
                     order_line,
                     shipping_address,
                     billing_address,
                     shipping_lines,
                     discount_applications,
                     discount_amount,
                     tax_lines
                 }) {
    try {
        let salesOrderRecord = record.transform({
            fromType: record.Type.CUSTOMER,
            fromId: entity,
            toType: record.Type.SALES_ORDER,
            isDynamic: true
        });
        let shippingFields = [];
        if (jjUtil.checkForParameter(shipping_address)) {
            shippingFields = [
                {
                    fieldId: 'country',
                    value: jjUtil.isNumberOrString(shipping_address.country_code) ? shipping_address.country_code : ""
                },
                {
                    fieldId: 'attention',
                    value: ""
                },
                {
                    fieldId: 'addressee',
                    value: jjUtil.isNumberOrString(shipping_address.name) ? shipping_address.name : ""
                },
                {
                    fieldId: 'addrphone',
                    value: jjUtil.isNumberOrString(shipping_address.phone) ? shipping_address.phone : ""
                },
                {
                    fieldId: 'addr1',
                    value: jjUtil.isNumberOrString(shipping_address.address1) ? shipping_address.address1 : ""
                },
                {
                    fieldId: 'addr2',
                    value: jjUtil.isNumberOrString(shipping_address.address2) ? shipping_address.address2 : ""
                },
                {
                    fieldId: 'addr3',
                    value: ""
                },
                {
                    fieldId: 'city',
                    value: jjUtil.isNumberOrString(shipping_address.city) ? shipping_address.city : ""
                },
                {
                    fieldId: 'state',
                    value: jjUtil.isNumberOrString(shipping_address.province) ? shipping_address.province : ""
                },
                {
                    fieldId: 'zip',
                    value: jjUtil.isNumberOrString(shipping_address.zip) ? shipping_address.zip : ""
                }
            ]
        }
        let shipAddressRecord = salesOrderRecord.getSubrecord({
            fieldId: 'shippingaddress'
        });
        shipAddressRecord.setValue({
            fieldId: 'customform',
            value: '56'
        });
        log.debug('shipAddressRecord', shipAddressRecord);
        //Set Address Sublist Subrecord values
        for (let subrecordField of shippingFields) {
            if (subrecordField.value !== null && subrecordField.value !== undefined && subrecordField.value !== "") {
                try {
                    shipAddressRecord.setValue({
                        fieldId: subrecordField.fieldId,
                        value: subrecordField.value,
                        ignoreFieldChange: true
                    });
                } catch (er) {
                    log.error('error@ setting shipping Address Fields skipped', JSON.stringify(er));
                    continue;
                }
            }
        }
        let billingFields = [
            {
                fieldId: 'country',
                value: jjUtil.isNumberOrString(billing_address.country_code) ? billing_address.country_code : ""
            },
            {
                fieldId: 'attention',
                value: ""
            },
            {
                fieldId: 'addressee',
                value: jjUtil.isNumberOrString(billing_address.name) ? billing_address.name : ""
            },
            {
                fieldId: 'addrphone',
                value: jjUtil.isNumberOrString(billing_address.phone) ? billing_address.phone : ""
            },
            {
                fieldId: 'addr1',
                value: jjUtil.isNumberOrString(billing_address.address1) ? billing_address.address1 : ""
            },
            {
                fieldId: 'addr2',
                value: jjUtil.isNumberOrString(billing_address.address2) ? billing_address.address2 : ""
            },
            {
                fieldId: 'addr3',
                value: ""
            },
            {
                fieldId: 'city',
                value: jjUtil.isNumberOrString(billing_address.city) ? billing_address.city : ""
            },
            {
                fieldId: 'state',
                value: jjUtil.isNumberOrString(billing_address.province) ? billing_address.province : ""
            },
            {
                fieldId: 'zip',
                value: jjUtil.isNumberOrString(billing_address.zip) ? billing_address.zip : ""
            }
        ]
        let billAddressRecord = salesOrderRecord.getSubrecord({
            fieldId: 'billingaddress'
        });
        log.debug('billAddressRecord', billAddressRecord);
        //Set Address Sublist Subrecord values
        for (let subrecordField2 of billingFields) {
            if (subrecordField2.value !== null && subrecordField2.value !== undefined && subrecordField2.value !== "") {
                try {
                    billAddressRecord.setValue({
                        fieldId: subrecordField2.fieldId,
                        value: subrecordField2.value,
                        ignoreFieldChange: true
                    });
                } catch (er) {
                    log.error('error@ setting billing Address Fields skipped', JSON.stringify(er));
                    continue;
                }
            }
        }
        //Field Map for Sales Order Body Fields
        let bodyFieldArray = [
            {
                fieldId: 'tranid',
                value: (order_num).toString()
            },
            {
                fieldId: 'custbody_jj_shopify_order_id_oius196',
                value: (shopifyOrderId).toString()
            },
            {
                fieldId: 'memo',
                value: order_note && util.isString(order_note) ? order_note.toString().substring(0, 200) : ""
            },
            {
                fieldId: 'currency', value: 1 //USD
            },
            {
                fieldId: 'location', value: 1
            },
            {
                fieldId: 'trandate', value: order_date ? new Date(order_date.toString().trim()) : new Date()
            },
            {
                fieldId: 'class',
                value: CLASS
            },
            {
                fieldId: 'custbody_osi69_jj_source_webstore',
                value: SOURCE
            }
        ];
        log.debug('bodyFieldArray of salesorder', bodyFieldArray);
        log.debug('id',FORM)
        //To set body fields in Sales Order Record
        for (let bodyField of bodyFieldArray) {
            if (bodyField.value !== null && bodyField.value !== undefined && bodyField.value !== "") {
                try {
                    salesOrderRecord.setValue({fieldId: bodyField.fieldId, value: bodyField.value});
                } catch (er) {
                    log.error('error@createSalesOrder in setting Sales Order Body Field skipped', JSON.stringify(er));
                    continue;
                }
            }
        }
        //Shipment Methods
        log.debug('shipping_lines',shipping_lines);
        if (jjUtil.checkForParameter(shipping_lines) && shipping_lines.length != 0) {
            log.debug('set shipmethod!!')
            salesOrderRecord.setValue({
                fieldId: "shipmethod",
                value: SHIPMETHOD
            });
            salesOrderRecord.setValue({
                fieldId: "shippingcost",
                value: Number(shipping_lines[0].price)
            });
        } else {
        }
        // tax lines
        log.debug('tax lines',tax_lines);
        if (jjUtil.checkForParameter(tax_lines) && tax_lines.length != 0) {
            log.debug('set tax !!')
            salesOrderRecord.setValue({
                fieldId: "istaxable",
                value: true
            });
        } else {
        }
        //Discount Items
        if (discount_applications.length != 0) {
            salesOrderRecord.selectNewLine({sublistId: 'item'});
            salesOrderRecord.setCurrentSublistValue({
                sublistId: 'item',
                fieldId: 'item',
                value: DISCOUNT_ITEM
            });
            salesOrderRecord.setCurrentSublistValue({
                sublistId: 'item',
                fieldId: 'quantity',
                value: 1,
                ignoreFieldChange: false
            });
            salesOrderRecord.setCurrentSublistValue({
                sublistId: 'item',
                fieldId: 'rate',
                value: Number(discount_amount) * -1,
                ignoreFieldChange: false
            });
            salesOrderRecord.setCurrentSublistValue({
                sublistId: 'item',
                fieldId: 'amount',
                value: Number(discount_amount) * -1,
                ignoreFieldChange: false
            });
            salesOrderRecord.commitLine({sublistId: 'item'});
        }
        //add items
        log.debug('order_line', order_line);
        for (let line of order_line) {
            let itemId = savedSearch.fetchShopifyItemID(line.product_id, shopifyRecordId);
            log.debug('itemId', itemId);
            if (jjUtil.checkForParameter(itemId)) {
                try {
                    log.debug('inside item update!!')
                    salesOrderRecord.selectNewLine({sublistId: 'item'});
                    salesOrderRecord.setCurrentSublistValue({
                        sublistId: 'item',
                        fieldId: 'item',
                        value: itemId
                    });
                    salesOrderRecord.setCurrentSublistValue({
                        sublistId: 'item',
                        fieldId: 'quantity',
                        value: (Number(line.quantity)).toString()
                    });
                    salesOrderRecord.setCurrentSublistValue({
                        sublistId: 'item',
                        fieldId: 'rate',
                        value: Number(line.price),
                        ignoreFieldChange: false
                    });
                    salesOrderRecord.setCurrentSublistValue({
                        sublistId: 'item',
                        fieldId: 'amount',
                        value: Number(line.price) * Number(line.quantity),
                        ignoreFieldChange: false
                    });
                    salesOrderRecord.commitLine({sublistId: 'item'});
                } catch (e) {
                    log.error('error@createSalesOrder', e);
                    record.submitFields({
                        type: "customrecord_shopify_int_info",
                        id: shopifyRecordId,
                        values: {
                            custrecord_jj_err_on_so_creation: JSON.stringify(e)
                        },
                        options: {enableSourcing: true, ignoreMandatoryFields: true}
                    });
                    return false;
                }
            } else {
                let errormsg = "Shopify item is not available in NetSuite";
                log.error('errormsg', errormsg);
                record.submitFields({
                    type: "customrecord_shopify_int_info",
                    id: shopifyRecordId,
                    values: {
                        custrecord_jj_err_on_so_creation: errormsg
                    },
                    options: {enableSourcing: true, ignoreMandatoryFields: true}
                });
                return false;
            }
        }
        let salesOrderId = salesOrderRecord.save({ignoreMandatoryFields: true, enableSourcing: true})
        log.debug('salesOrderId 1142', salesOrderId);
        record.submitFields({
            type: "customrecord_shopify_int_info",
            id: shopifyRecordId,
            values: {
                custrecord_jj_sales_order_id: salesOrderId,
                custrecord_jj_err_on_so_creation: "",
            },
            options: {enableSourcing: true, ignoreMandatoryFields: true}
        });
        return salesOrderId;
    } catch
        (err) {
        log.error('error@createSalesOrder', err);
        record.submitFields({
            type: "customrecord_shopify_int_info",
            id: shopifyRecordId,
            values: {
                custrecord_jj_err_on_so_creation: JSON.stringify(err)
            },
            options: {enableSourcing: true, ignoreMandatoryFields: true}
        });
        return false;
    }
}