import type SmartPhoto from 'smartphoto';
import type { SmartPhotoOptions, SmartPhotoSource } from 'smartphoto';

// セレクタ・オプションを呼び出しごとに変えられる汎用ファクトリで、呼ぶたびに新しい
// SmartPhoto インスタンスを生成する。ここでシングルトン化すると、セレクタやオプションが
// 異なる呼び出しでも先勝ちの古いインスタンスを返してしまい、呼び出し元の想定と異なる
// 挙動になる。多重生成を防ぎたい呼び出し元(ACMS.Dispatch 等)は、呼び出し側で自身の
// 責務として冪等性を担保すること(smartphoto 側は new のたびに document への click 委譲
// リスナーと <dialog> を新規生成し、古いインスタンスの後始末は行わないため)。
const smartPhoto = async (
  source: SmartPhotoSource = ACMS.Config.SmartPhotoMark,
  options: SmartPhotoOptions = {}
): Promise<SmartPhoto> => {
  import(/* webpackChunkName: "smartphoto-css" */ 'smartphoto/css/smartphoto.min.css');
  const { default: SmartPhotoClass } = await import(/* webpackChunkName: "smartphoto" */ 'smartphoto');
  return new SmartPhotoClass(source, { ...ACMS.Config.SmartPhotoConfig, ...options });
};

export default smartPhoto;
