/*
 * Copyright (c) 2021 Huawei Device Co., Ltd.
 * 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.
 */

const medialibrary = requireInternal('multimedia.mediaLibrary');
const featureAbility = requireNapi('ability.featureAbility');
const ARGS_ONE = 1;
const ARGS_TWO = 2;

function getParameter() {
  const select = 'singleselect';
  const parameter = {
    want:
    {
      action: 'ohos.want.action.photoPicker',
      type: select,
      parameters: {
        uri: select,
        filterMediaType: 'FILTER_MEDIA_TYPE_ALL',
        maxSelectCount: 1
      }
    },
    action: 'ohos.want.action.photoPicker',
    type: select,
    parameters: {
      uri: select,
      filterMediaType: 'FILTER_MEDIA_TYPE_ALL',
      maxSelectCount: 1
    }
  };
  return parameter;
}

async function startMediaSelect(option, asyncCallback) {
  console.log('MediaLibrary startMediaSelectInner param num ' + arguments.length);
  console.log('MediaLibrary startMediaSelectInner param ' + JSON.stringify(option));

  const parameter = getParameter();

  if (option !== undefined && typeof option === 'object') {
    if (option.count !== undefined && option.count > 1) {
      parameter.want.type = 'multipleselect';
      parameter.want.parameters.uri = 'multipleselect';
      parameter.want.parameters.maxSelectCount = option.count;
      parameter.type = 'multipleselect';
      parameter.parameters.uri = 'multipleselect';
      parameter.parameters.maxSelectCount = option.count;
    }
    if (option.type !== undefined) {
      parameter.want.parameters.filterMediaType = option.type;
      parameter.parameters.filterMediaType = option.type;
    }
  }
  if (arguments.length === ARGS_TWO && typeof asyncCallback !== 'function') {
    console.log('MediaLibrary startMediaSelectInner callback invalid');
    throw Error('invalid callback');
  }
  console.log('MediaLibrary startMediaSelectInner parameter ' + JSON.stringify(parameter));
  const result = await featureAbility.startAbilityForResult(parameter);
  console.log('MediaLibrary startMediaSelectInner result ' + JSON.stringify(result));
  const uri = result.want.parameters['select-item-list'];
  if (arguments.length === ARGS_TWO && typeof asyncCallback === 'function') {
    console.log('MediaLibrary startMediaSelectInner callback ' + uri);
    return asyncCallback(result.resultCode, uri);
  }
  return new Promise((resolve, reject) => {
    if (result.resultCode === 0) {
      console.log('MediaLibrary startMediaSelectInner promise ' + uri);
      resolve(uri);
    } else {
      console.log('MediaLibrary startMediaSelectInner err ' + result.resultCode);
      reject(result.resultCode);
    }
  });
}

function getMediaLibrary(context) {
  const media = medialibrary.getMediaLibrary(context);
  console.log('MediaLibrary getMediaLibrary inner ');
  if (media !== undefined) {
    console.log('MediaLibrary getMediaLibrary inner add startMediaSelect');
    media.startMediaSelect = startMediaSelect;
  }
  return media;
}

function getMediaLibraryAsync(context, asyncCallback) {
  console.log('MediaLibrary getMediaLibraryAsync js caller ');
  if (context === undefined) {
    console.log('MediaLibrary getMediaLibraryAsync context invalid');
    throw Error('invalid context');
  }
  if (arguments.length === ARGS_ONE) {
    return medialibrary.getMediaLibraryAsync(context)
      .then((media) => {
        console.log('MediaLibrary getMediaLibraryAsync js caller add startMediaSelect');
        media.startMediaSelect = startMediaSelect;
        return media;
      })
      .catch((err) => {
        console.log('MediaLibrary getMediaLibraryAsync js caller err ' + err);
        throw Error(err);
      });
  } else if (arguments.length === ARGS_TWO && typeof asyncCallback === 'function') {
    medialibrary.getMediaLibraryAsync(context, (err, media) => {
      console.log('MediaLibrary getMediaLibraryAsync js caller callback ' + err);
      if (err) {
        asyncCallback(err);
      } else {
        if (media !== undefined) {
          console.log('MediaLibrary getMediaLibraryAsync js caller add startMediaSelect');
          media.startMediaSelect = startMediaSelect;
        }
        asyncCallback(err, media);
      }
    });
  } else {
    console.log('MediaLibrary getMediaLibraryAsync js caller param invalid');
    throw Error('invalid param');
  }
  return undefined;
}

function getScannerInstance(context) {
  console.log('MediaLibrary getScannerInstance js caller ');
  const instance = medialibrary.getScannerInstance(context);
  return instance;
}

export default {
  getMediaLibrary,
  getMediaLibraryAsync,
  getScannerInstance,
  MediaType: medialibrary.MediaType,
  FileKey: medialibrary.FileKey,
  DirectoryType: medialibrary.DirectoryType,
  PrivateAlbumType: medialibrary.PrivateAlbumType
};