// アプリ側のオブジェクト登録
const HostObj = chrome.webview.hostObjects.HostMethod;

// アプリ画面のサイズを変更する
function ChangeWindowsSize(width, height) {
//    console.log(width, height);
    HostObj.RequestChangeWindowSize(width, height);
}

// 外部EXEの実行
// strExePath : 外部EXEのフルパスもしくは、アプリからの相対パス
// strOption  : オプション文字列
// bElevate   : 権限昇格の有無(true / false)
async function RequestExecute(strExePath, strOption, bElevate) {
    return await HostObj.Exec(strExePath, strOption, bElevate);
}

// ホストに対して、ZIPファイルの解凍コピーを指示
// strZipFile     : ZIPファイルのパス
// strExtractPath : 解凍先パス（ディレクトリ）
// strSuccessMsg  : 成功時のメッセージ内容（空の場合は表示されない） 
function RequestExtractToCopy(strZipFile, strExtractPath, strSuccessMsg) {
    HostObj.ExtractToCopy(strZipFile, strExtractPath, strSuccessMsg);
}

// ホストに対して、ファイルのコピーを指示
// strSrcDir      : コピー元のディレクトリへのパス
// strPattern     : コピー対象とするファイルのパターン("*.zip"等)
// strDest        : コピー先（ディレクトリ）
// strSuccessMsg  : 成功時のメッセージ内容（空の場合は表示されない） 
function RequestCopyFiles(strSrcDir, strPattern, strDest, strSuccessMsg) {
    HostObj.CopyFiles(strSrcDir, strPattern, strDest, strSuccessMsg);
}


async function getUsbDriveList() {
    // 取得するデータの構造
    // 	obj.DriveName          : ドライブ名
    // 	obj.VolumeLabel        : ボリュームラベル
    // 	obj.AvailableFreeSpace : 空き容量
    // 	obj.TotalSize          : 総容量

    let jsonData = await HostObj.GetUSBDriveList();
    if (jsonData != "") {
        let data = JSON.parse(jsonData);
        return data;
    }
    return null;
}

// USBドライブの取り外しの実施
async function EjectDrive() {
    let drive = document.getElementById('drive');
    let path = drive.options[drive.selectedIndex].value;
    let res = await HostObj.RequestEjectDrive(path, "Eject is success.");
}

// アプリケーションのタイトルのメッセージを設定する。
function SetTitleString(strTitle) {
    HostObj.RequestSetTitle(strTitle);
}

// ページの遷移を実施する
// 言語の設定を引き継ぐ為、クエリとして言語を追加する。
// strPagePathは絶対パスかアプリからの相対パス
async function movePage(strPagePath, language) {
    const url = new URL(await HostObj.ConvertToURL(strPagePath));
    url.searchParams.set('lang', language);
    window.location.href = url.toString();
}

async function getComPortList() {
    // 取得するデータの構造
    // 	obj.PortName           : ポート名
    // 	obj.Name               : デバイス名
    // 	obj.PID                : USB PID
    // 	obj.VID                : USB VID

    let jsonData = await HostObj.GetComPortList();
    if (jsonData != "") {
        let data = JSON.parse(jsonData);
        return data;
    }
    return null;
}


//
// get parameter for communicaton
//
async function getLastLanSelection() {
    return await HostObj.IsSelectLan;
}
async function getLatestComPort() {
    return await HostObj.ComPort;
}
async function getLastBaudrate() {
    return await HostObj.Baudrate;
}
async function getLastHostName() {
    return await HostObj.HostName;
}
async function getLastSockPort() {
    return await HostObj.SockPort;
}
async function getLastLoginUser() {
    return await HostObj.LoginUser;
}
async function getLastLoginPassword() {
    return await HostObj.LoginPassword;
}
//
// set parameter for communication
function setLanSelection(isSelLan) {
    HostObj.IsSelectLan = isSelLan;
}
function setComPort(strComPort) {
    HostObj.ComPort = strComPort;
}
function setBaudrate(nBaudrate) {
    HostObj.Baudrate = nBaudrate;
}
function setHostName(strHostName) {
    HostObj.HostName = strHostName;
}
function setSockPort(nSockPort) {
    HostObj.SockPort = nSockPort;
}
function setLoginUser(strUser) {
    HostObj.LoginUser = strUser;
}
function setLoginPassword(strPass) {
    HostObj.LoginPassword = strPass;
}

//
// return boolean
//
async function openComPort(port, baud) {
    return await HostObj.OpenComPort(port, baud);
}

//
// return boolean
//
async function openSockPort(host, port, user, pass) {
    return await HostObj.OpenSockPort(host, port, user, pass);
}

function closePort() {
    HostObj.ConnectionClose();
}

async function sendReceiveCmd(cmd_data) {
    // SendRcvCmdの応答はJSONのデータ
    // 	boolean obj.IsDetectTimeout
    //	boolean obj.IsDetectOK
    //	boolean obj.IsDetectErr
    //	String  obj.responseData
    //	Array<string> obj.LineDatas
    let resp = await HostObj.SendRcvCmd(cmd_data);
    if (resp != "") {
        let data = JSON.parse(resp);
        return data;
    }
    return null;
}

async function sendComSetCommand(cmd_data, port, baud) {
    let ret = false;
    if (await openComPort(port, baud)) {
        let resp = await sendReceiveCmd(cmd_data);
        if (resp != null) {
            if (resp.IsDetectOK) {
                ret = true;
            }
        }
        closePort();
    }
    return ret;
}

async function sendComSetCommands(cmd_datas, port, baud) {
    let ret = false;
    if (await openComPort(port, baud)) {
        ret = true;
        for (let i = 0; i < cmd_datas.length; i++) {
            let resp = await sendReceiveCmd(cmd_data);
            if (resp != null) {
                if (!resp.IsDetectOK) {
                    ret = false;
                    break;
                }
            } else {
                ret = false;
                break;
            }
        }
        closePort();
    }
    return ret;
}

async function sendComGetCommand(cmd_data, port, baud) {
    let ret = null;
    if (await openComPort(port, baud)) {
        ret = await sendReceiveCmd(cmd_data);
        closePort();
    }
    return ret;
}

async function sendSockSetCommand(cmd_data, host, port, user, pass) {
    let ret = false;
    if (await openSockPort(host, port, user, pass)) {
        let resp = await sendReceiveCmd(cmd_data);
        if (resp != null) {
            if (resp.IsDetectOK) {
                ret = true;
            }
        }
        closePort();
    }
    return ret;
}

async function sendSockSetCommands(cmd_datas, host, port, user, pass) {
    let ret = false;
    if (await openSockPort(host, port, user, pass)) {
        ret = true;
        for (let i = 0; i < cmd_datas.length; i++) {
            let resp = await sendReceiveCmd(cmd_data);
            if (resp != null) {
                if (!resp.IsDetectOK) {
                    ret = false;
                    break;
                }
            } else {
                ret = false;
                break;
            }
        }
        closePort();
    }
    return ret;
}

async function sendSockGetCommand(cmd_data, host, port, user, pass) {
    let ret = null;
    if (await openSockPort(host, port, user, pass)) {
        ret = await sendReceiveCmd(cmd_data);
        closePort();
    } else {
        console.log("Port open error!!");
    }
    return ret;
}
