/*
 * 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 { SCBScreenProperty } from '@ohos/windowscene';
import { ViewModelType } from './constants/BaseConstants';
import { IFreeWindowsViewModel } from './presenter/IFreeWindowsViewModel';
import { SCBPcFreeWindowsViewModel } from './presenter/SCBPcFreeWindowsViewModel';
import { SCBScenePanelProxy } from './presenter/SCBScenePanelProxy';

/**
 * 窗口管理类,对外提供代理的管理
 */
export class SCBFreeWindowsViewModelManager {
  private static INSTANCE: SCBFreeWindowsViewModelManager;
  private presenterMap: Map<number, IFreeWindowsViewModel> = new Map();

  constructor() {
  }

  /**
   * 单例对象
   *
   * @returns 单例对象
   */
  public static getInstance(): SCBFreeWindowsViewModelManager {
    if (!SCBFreeWindowsViewModelManager.INSTANCE) {
      SCBFreeWindowsViewModelManager.INSTANCE = new SCBFreeWindowsViewModelManager();
    }
    return SCBFreeWindowsViewModelManager.INSTANCE;
  }

  /**
   * 获取或者创建对应ViewModel
   *
   * @param uiContext 上下文
   * @param screenProperty 屏幕参数
   * @param presenterType 类型
   * @returns
   */
  public getOrCreatePresenter(uiContext: UIContext, screenProperty: SCBScreenProperty, panelProxy: SCBScenePanelProxy,
    presenterType: ViewModelType): IFreeWindowsViewModel {
    const screenId = screenProperty.screenId;
    let presenter = this.presenterMap.get(screenId);
    if (presenter === undefined) {
      presenter = this.createPresenter(uiContext, screenProperty, panelProxy, presenterType);
      this.presenterMap.set(screenId, presenter);
    }
    return presenter;
  }

  /**
   * 创建对应ViewModel
   *
   * @param uiContext
   * @param screenProperty
   * @param presenterType
   * @returns
   */
  private createPresenter(uiContext: UIContext, screenProperty: SCBScreenProperty, panelProxy: SCBScenePanelProxy,
    presenterType: ViewModelType): IFreeWindowsViewModel {
    switch (presenterType) {
      case ViewModelType.VIEW_MODEL_PC:
        return new SCBPcFreeWindowsViewModel(uiContext, screenProperty, panelProxy);
      default:
        return new SCBPcFreeWindowsViewModel(uiContext, screenProperty, panelProxy);
    }
  }

  /**
   * 获取对应ViewModel
   *
   * @param screenId 屏幕ID
   * @returnsViewModel
   */
  public getPresenter(screenId: number): IFreeWindowsViewModel | null {
    if (this.presenterMap.has(screenId)) {
      return this.presenterMap.get(screenId) as IFreeWindowsViewModel;
    }
    return null;
  }

  /**
   * 移除ViewModel
   *
   * @param screenId 屏幕ID
   */
  public removePresenter(screenId: number): void {
    if (this.presenterMap.has(screenId)) {
      this.presenterMap.delete(screenId);
    }
  }
}