import {
  MediaType,
  Query,
  JazzRoom,
  JazzClient,
  JazzSdk,
  JazzSdkPlugin,
} from '@salutejs/jazz-sdk-web';
import { Observable } from 'rxjs';

type JazzSdkMediaAccessType = 'microphone' | 'camera' | 'screen';
type JazzSdkMediaAccessStatus =
  | 'not-determined'
  | 'granted'
  | 'denied'
  | 'restricted'
  | 'unknown';
type JazzSdkAskForMediaAccessType = 'microphone' | 'camera';
type JazzSdkSystemSettingsKey =
  | 'microphone-security'
  | 'camera-security'
  | 'screen-share-security';
type JazzSdkDesktopCapturerSourcesEventUpdateSources = {
  type: 'updateSources';
  payload: {
    sources: JazzSdkDesktopCapturerSource[];
    added: JazzSdkDesktopCapturerSource[];
    removed: JazzSdkDesktopCapturerSource[];
  };
};
type ProcessType = {
  frameId: number;
  images: JazzSdkDesktopCapturerOptionImages;
};
type JazzSdkDesktopCapturerSourcesEventStartProcess = {
  type: 'startProcess';
  payload: ProcessType;
};
type JazzSdkDesktopCapturerSourcesEventFinishProcess = {
  type: 'finishProcess';
  payload: ProcessType;
};
type JazzSdkDesktopCapturerOptionImages =
  | {
      isEnable: false;
    }
  | {
      isEnable: true;
      thumbnailSize: {
        height: number;
        width: number;
      };
    };
type JazzSdkDesktopCapturerOptions = Readonly<{
  types: Array<'window' | 'screen'>;
  images: JazzSdkDesktopCapturerOptionImages;
}>;
type JazzSdkDesktopCapturerSourceType = 'screen' | 'window';
type JazzSdkDesktopCapturerSource = Readonly<{
  id: string;
  type: JazzSdkDesktopCapturerSourceType;
  name: string;
  displayId: string;
  image?: string;
}>;

type JazzSdkDesktopCapturerEventSelectDesktopSource = {
  type: 'selectDesktopSource';
  payload: {
    source: JazzSdkDesktopCapturerSource;
    isShareDisplayAudio: boolean;
  };
};
type JazzSdkDesktopCapturerEventCancel = {
  type: 'cancel';
  payload: {
    action: 'cancel';
  };
};
type JazzSdkDesktopCapturerEventSources = {
  type: 'sources';
  payload: {
    sources: JazzSdkDesktopCapturerSource[];
  };
};
type JazzSdkDesktopCapturerEventUpdateSources =
  JazzSdkDesktopCapturerSourcesEventUpdateSources;
type JazzSdkDesktopCapturerEventStartProcess =
  JazzSdkDesktopCapturerSourcesEventStartProcess;
type JazzSdkDesktopCapturerEventFinishProcess =
  JazzSdkDesktopCapturerSourcesEventFinishProcess;
type JazzSdkDesktopCapturerEvent =
  | JazzSdkDesktopCapturerEventSelectDesktopSource
  | JazzSdkDesktopCapturerEventCancel
  | JazzSdkDesktopCapturerEventUpdateSources
  | JazzSdkDesktopCapturerEventStartProcess
  | JazzSdkDesktopCapturerEventFinishProcess
  | JazzSdkDesktopCapturerEventSources;
type JazzSdkDesktopCapturerService = {
  getMediaAccessStatus: (
    type: JazzSdkMediaAccessType,
  ) => Promise<JazzSdkMediaAccessStatus>;
  requestDesktopMediaAccess: (
    type: MediaType,
  ) => Promise<JazzSdkMediaAccessStatus>;
  status: Query<JazzSdkDesktopCapturerStatus>;
  sources: Query<JazzSdkDesktopCapturerSource[]>;
  accessStatus: Query<JazzSdkMediaAccessStatus | undefined>;
  isSupportedShareDisplayAudio: Query<boolean>;
  selectSource: (
    source: JazzSdkDesktopCapturerSource,
    isShareDisplayAudio?: boolean,
  ) => void;
  openSystemSettings: (type: JazzSdkSystemSettingsKey) => Promise<void>;
  cancel: () => void;
  event$: Observable<JazzSdkDesktopCapturerEvent>;
};
type JazzSdkDesktopCapturerStatus = 'started' | 'finished' | 'pending';
type JazzSdkDesktopPicker = {
  onSourceChoose: (
    streamId?: string,
    streamType?: string,
    screenShareAudio?: boolean,
  ) => void;
};

declare function getDesktopCapturer(
  sdk: JazzRoom | JazzClient | JazzSdk,
): JazzSdkDesktopCapturerService;

declare function desktopCapturerPlugin(): JazzSdkPlugin;

export {
  type JazzSdkAskForMediaAccessType,
  type JazzSdkDesktopCapturerEvent,
  type JazzSdkDesktopCapturerEventCancel,
  type JazzSdkDesktopCapturerEventSelectDesktopSource,
  type JazzSdkDesktopCapturerOptions,
  type JazzSdkDesktopCapturerService,
  type JazzSdkDesktopCapturerSource,
  type JazzSdkDesktopCapturerStatus,
  type JazzSdkDesktopPicker,
  type JazzSdkMediaAccessStatus,
  type JazzSdkMediaAccessType,
  type JazzSdkSystemSettingsKey,
  desktopCapturerPlugin,
  getDesktopCapturer,
};
