export async function onUnlinkProvider(req : express.Request, res : express.Response)
{
    const log = slog.stepIn('SettingsApi', 'onUnlinkProvider');
    try
    {
        do
        {
            const locale = req.ext.locale;
            const param     : Request.UnlinkProvider = req.body;
            const condition : Request.UnlinkProvider =
            {
                provider: ['string', null, true] as any
            };

            if (Utils.existsParameters(param, condition) === false)
            {
                res.ext.badRequest(locale);
                break;
            }

            // プロバイダ名チェック
            const {provider} = param;
            log.d(`${provider}`);

            if (provider !== 'twitter'
            &&  provider !== 'facebook'
            &&  provider !== 'google'
            &&  provider !== 'github')
            {
                res.ext.badRequest(locale);
                break;
            }

            // アカウント更新
            const session : Session = req.ext.session;
            const account = await AccountAgent.find(session.account_id);

            if (AccountAgent.canUnlink(account, provider))
            {
                account[provider] = null;
                await AccountAgent.update(account);

                const response : Response.UnlinkProvider = {status:Response.Status.OK, message:{}};
                res.json(response);
            }
            else
            {
                const response : Response.UnlinkProvider =
                {
                    status: Response.Status.FAILED,
                    message: {general:R.text(R.CANNOT_UNLINK, locale)}
                };
                res.json(response);
            }
        }
        while (false);
        log.stepOut();
    }
    catch (err) {Utils.internalServerError(err, res, log);}
}
export async function isRequestChangeEmailValid(param : Request.RequestChangeEmail, myAccount : Account, locale : string) : Promise<ValidationResult>
{
    const log = slog.stepIn('SettingsApi', 'isRequestChangeEmailValid');
    const response : Response.RequestChangeEmail = {status:Response.Status.OK, message:{}};
    const {email} = param;

    do
    {
        if (email)
        {
            const alreadyExistsAccount = await AccountAgent.findByProviderId('email', email);
            const resultEmail = await Validator.email(email, myAccount.id, alreadyExistsAccount, locale);

            if (resultEmail.status !== Response.Status.OK)
            {
                response.status =        resultEmail.status;
                response.message.email = resultEmail.message;
            }
        }
        else
        {
            if (AccountAgent.canUnlink(myAccount, 'email') === false)
            {
                response.status = Response.Status.FAILED;
                response.message.email = R.text(R.CANNOT_EMPTY_EMAIL, locale);
            }
        }
    }
    while (false);

    if (response.status !== Response.Status.OK) {
        log.w(JSON.stringify(response, null, 2));
    }

    log.stepOut();
    return {response};
}
export async function isChangePasswordValid(param : Request.ChangePassword, myAccountId : number, locale : string) : Promise<ValidationResult>
{
    const log = slog.stepIn('SettingsApi', 'isChangePasswordValid');
    const response : Response.ChangePassword = {status:Response.Status.OK, message:{}};
    const {oldPassword, newPassword, confirm} = param;

    let account : Account = null;

    do
    {
        // パスワード検証
        const passwordResult = Validator.password({password:newPassword, confirm, canNull:true}, locale);

        if (passwordResult.status !== Response.Status.OK)
        {
            response.status =              passwordResult.status;
            response.message.newPassword = passwordResult.password;
            response.message.confirm =     passwordResult.confirm;
        }

        // アカウント存在検証
        account = await AccountAgent.find(myAccountId);

        if (account === null)
        {
            response.status = Response.Status.FAILED;
            response.message.general = R.text(R.ACCOUNT_NOT_FOUND, locale);
            break;
        }

        // メールアドレスが設定されているかどうか
        if (account.email === null)
        {
            response.status = Response.Status.FAILED;
            response.message.general = R.text(R.CANNOT_SET_PASSWORD, locale);
        }

        // パスワードを未設定にする場合は他に認証手段があるかどうか
        if (newPassword === null)
        {
            if (AccountAgent.canUnlink(account, 'email') === false)
            {
                response.status = Response.Status.FAILED;
                response.message.newPassword = R.text(R.CANNOT_NO_SET_PASSWORD, locale);
            }
        }

        // 現在のパスワードと現在のパスワードとして入力されたパスワードが一致するかどうか
        if (account.password !== null || oldPassword !== null)
        {
            const hashPassword = Utils.getHashPassword(account.email, oldPassword, Config.PASSWORD_SALT);

            if (hashPassword !== account.password)
            {
                response.status = Response.Status.FAILED;
                response.message.oldPassword = R.text(R.INVALID_PASSWORD, locale);
            }
        }
    }
    while (false);

    if (response.status !== Response.Status.OK) {
        log.w(JSON.stringify(response, null, 2));
    }

    log.stepOut();
    return {response, account};
}