(function () {
    'use strict';

    // カスタマイズ対象テーブル
    const TABLE_CODE = 'テーブル';

    // 要素スタイル変更用フィールド
    const CHECK_CODE = '判定欄';

    // ルックアップ自動取得用
    const LOOKUP_CODE = 'ルックアップ';
    const LOOKUP_TABLE_CODE = ['工具1', 'トルクチェッカー1', '作業者_開始_1'];

    // ルックアップ一括取得用
    const LOOKUP_TABLE_CODE_3 = '作業者_開始_1';
    const HANDLE_CODE = 'ルックアップ変更イベント発火用';
    const CALC_CODE = '計測値_開始';
    let isPUT = false;

    // レコード追加画面表示時
    kintone.events.on('app.record.create.show', function (event) {
        try {
            // ルックアップ自動取得
            fetchLookup(event);

            // フィールド非表示
            disabledField(event);

            return event;
        } catch (error) {
            window.alert('error');
            console.log(error);
            return event;
        };
    });
    // レコード編集画面表示時
    kintone.events.on('app.record.edit.show', function (event) {
        try {
            // フィールド非表示
            disabledField(event);

            return event;
        } catch (error) {
            window.alert('error');
            console.log(error);
            return event;
        };
    });

    // レコード追加画面フィールド変更イベント
    kintone.events.on(`app.record.create.change.${HANDLE_CODE}`, function (event) {
        try {
            // ルックアップ一括取得
            bulkGetLookup(event);

            return event;
        } catch (error) {
            window.alert('error');
            console.log(error);
            return event;
        }
    });
    // レコード編集画面フィールド変更イベント
    kintone.events.on(`app.record.edit.change.${HANDLE_CODE}`, function (event) {
        try {
            // ルックアップ一括取得
            bulkGetLookup(event);

            return event;
        } catch (error) {
            window.alert('error');
            console.log(error);
            return event;
        }
    });
    // レコード追加画面フィールド変更イベント
    kintone.events.on(`app.record.create.change.${TABLE_CODE}`, function (event) {
        try {
            // ルックアップ一括取得
            bulkGetLookup(event);

            return event;
        } catch (error) {
            window.alert('error');
            console.log(error);
            return event;
        }
    });
    // レコード編集画面フィールド変更イベント
    kintone.events.on(`app.record.edit.change.${TABLE_CODE}`, function (event) {
        try {
            // ルックアップ一括取得
            bulkGetLookup(event);

            return event;
        } catch (error) {
            window.alert('error');
            console.log(error);
            return event;
        }
    });

    // レコード詳細画面表示時
    kintone.events.on('app.record.detail.show', function (event) {
        try {
            if (isPUT) {
                location.reload();
            };
            // スタイル変更
            changeStyle(event);

            // フィールド非表示
            disabledField(event);

            return event;
        } catch (error) {
            window.alert('error');
            console.log(error);
            return event;
        }
    });

    // レコード追加保存成功後
    kintone.events.on('app.record.create.submit.success', async function (event) {
        try {
            // ルックアップ削除
            await deleteLookup(event);

            return event;
        } catch (error) {
            window.alert('error');
            console.log(error);
            return event;
        }
    });
    // レコード編集保存成功後
    kintone.events.on('app.record.edit.submit.success', async function (event) {
        try {
            // ルックアップ削除
            await deleteLookup(event);

            return event;
        } catch (error) {
            window.alert('error');
            console.log(error);
            return event;
        }
    });

    // ルックアップ自動取得
    function fetchLookup(event) {
        if (decodeURI(location.href).includes('?action=')) {
            event.record[LOOKUP_CODE].lookup = true;
            const targetTable = event.record[TABLE_CODE].value;
            targetTable.forEach(element => {
                LOOKUP_TABLE_CODE.forEach(e => {
                    element.value[e].lookup = true;
                });
            });
        };
    }

    // ルックアップ一括取得
    function bulkGetLookup(event) {
        const targetTable = event.record[TABLE_CODE].value;
        const targetValue = targetTable[0].value[LOOKUP_TABLE_CODE_3].value;
        const firstId = targetTable[0].id;
        if (targetValue === '' || firstId !== event.changes.row.id) {
            return;
        };
        for (let i = 1; i < targetTable.length; i++) {
            targetTable[i].value[LOOKUP_TABLE_CODE_3].value = targetValue;
            targetTable[i].value[LOOKUP_TABLE_CODE_3].lookup = true;
        };
    }

    // スタイル変更
    function changeStyle(event) {
        // 要素取得
        const checkFieldEl = kintone.app.record.getFieldElement(CHECK_CODE);
        if (event.record[CHECK_CODE].value === 'OK') {
            // 背景青、フォント白
            checkFieldEl.style.background = 'blue';
            checkFieldEl.style.color = 'white';
        } else if (event.record[CHECK_CODE].value === 'NG有') {
            // 背景赤、フォント白
            checkFieldEl.style.background = 'red';
            checkFieldEl.style.color = 'white';
        };
    }

    // 保存後ルックアップ削除
    async function deleteLookup(event) {
        const body = {
            app: kintone.app.getId(),
            id: event.record.$id.value,
            record: {
                [TABLE_CODE]: {
                    value: []
                }
            }
        };
        const targetTable = event.record[TABLE_CODE].value;
        let flag = false;
        for (let i = 0; i < targetTable.length; i++) {
            if (targetTable[i].value[CALC_CODE].value === '' || targetTable[i].value[CALC_CODE].value === null || targetTable[i].value[CALC_CODE].value === undefined) {
                body.record[TABLE_CODE].value.push(
                    {
                        id: targetTable[i].id,
                        value: {
                            [LOOKUP_TABLE_CODE_3]: {
                                value: ''
                            }
                        }
                    }
                );
                flag = true;
            } else {
                body.record[TABLE_CODE].value.push(
                    {
                        id: targetTable[i].id,
                        value: {}
                    }
                );
            };
        };
        if (flag) {
            await kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', body);
            isPUT = true;
        };
    }

    // フィールド非表示
    function disabledField(event) {
        kintone.app.record.setFieldShown(HANDLE_CODE, false);
    }
})();