/*
 * Copyright (c) Huawei Device Co., Ltd. 2024-2025. All rights reserved.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import accessibility from '@ohos.accessibility';
import { LogDomain, LogHelper } from '@ohos/basicutils';
import { RTLUtil } from '@ohos/componenthelper';
import { AccessibilityManager } from '@ohos/frameworkwrapper';
import { ResUtils } from '@ohos/windowscene';
import { LogWithHa } from '@ohos/systemuicommon/src/main/ets/maintenance/CommonExceptionMaintenance';
import { CommonExceptionCode } from '@ohos/systemuicommon/src/main/ets/maintenance/CommonExceptionCode';

const TAG: string = 'Notification-AccessibilityUtil';
const log = LogHelper.getLogHelper(LogDomain.NC, TAG);

export class NotificationAccessibilityUtil {

  /**
   * 判断当前是否在无障碍模式下
   */
  private static isAccessibilityMode(): boolean {
    return AccessibilityManager.getInstance().getIsAccessibilityMode();
  }

  /**
   * 在无障碍模式下主动播报信息
   *
   * @param textAnnouncedForAccessibility 主动播报信息
   *
   */
  private static sendAccessibility(textAnnouncedForAccessibility: string): void {
    if (!NotificationAccessibilityUtil.isAccessibilityMode()) {
      return;
    }
    let accessEventInfo: accessibility.EventInfo = ({
      type: 'announceForAccessibility',
      bundleName: 'com.ohos.sceneboard',
      triggerAction: 'click',
      textAnnouncedForAccessibility: '',
    });
    accessEventInfo.textAnnouncedForAccessibility = textAnnouncedForAccessibility;
    log.showInfo(`sendAccessibility textAnnouncedForAccessibility ${accessEventInfo.textAnnouncedForAccessibility}`);
    try {
      accessibility.sendAccessibilityEvent(accessEventInfo);
      log.showInfo(`Succeeded in send event, eventInfo is ${accessEventInfo}`);
    } catch (err) {
      LogWithHa.error(log, `sendAccessibilityEvent failed to send event, Code is ${err.code}, message is ${err.message}`,
        CommonExceptionCode.ACCESS_SEND_FAIL);
    }
  }

  /**
   * 获取组件滑动的无障碍播报描述
   *
   * @param isAccessibilityMode 当前是否为无障碍模式
   * @param isSwiped 是否已经滑动
   * @returns 是无障碍模式时返回对应场景的Description,非无障碍模式时返回空串,播放默认文本
   */
  public static getSwipeDescription(isAccessibilityMode: boolean, isSwiped: boolean): string {
    if (!isAccessibilityMode) {
      log.showInfo('GetSwipeDescription when disable model');
      return '';
    }
    // 已展开时,仅播报收起tip
    if (isSwiped) {
      return ResUtils.getInnerString($r('app.string.cc_accessibility_str_ntf_collapse_tips'));
    } else {
      return [
        ResUtils.getInnerString($r('app.string.cc_accessibility_str_click')),
        ResUtils.getInnerString($r('app.string.cc_accessibility_str_ntf_focused_action_tips'))].join(' ');
    }
  }

  // 通知卡片滑动结束后发送的语音播报内容
  public static sendNtfSwipeAccessibility(offsetX: number): void {
    if (!NotificationAccessibilityUtil.isAccessibilityMode()) {
      log.showInfo(`isAccessibilityMode ${NotificationAccessibilityUtil.isAccessibilityMode()}`);
      return;
    }
    const isRTL = RTLUtil.isRTL();
    const isToExpand = (isRTL && offsetX > 0) || (!isRTL && offsetX < 0);
    if (isToExpand) {
      // 展开更多操作后,播报更多操作已展开 和 右滑隐藏更多操作
      NotificationAccessibilityUtil.sendAccessibility([
        ResUtils.getInnerString($r('app.string.cc_accessibility_str_ntf_swipe_left_text')),
        ResUtils.getInnerString($r('app.string.cc_accessibility_str_ntf_collapse_tips'))].join(' '));
    } else {
      NotificationAccessibilityUtil.sendAccessibility(
        ResUtils.getInnerString($r('app.string.cc_accessibility_str_ntf_swipe_right_text')));
    }
  }

  public static sendNtfRemoveAccessibility(isRemoveEntry: boolean): void {
    if (!NotificationAccessibilityUtil.isAccessibilityMode()) {
      log.showInfo(`isAccessibilityMode ${NotificationAccessibilityUtil.isAccessibilityMode()}`);
      return;
    }
    log.showInfo(`isRemoveEntry: ${isRemoveEntry}`);
    if (isRemoveEntry) {
      NotificationAccessibilityUtil.sendAccessibility(
        ResUtils.getInnerString($r('app.string.cc_accessibility_str_ntf_swipe_remove_text')));
    }
  }
}