import { Plugin } from '@nocobase/server';
import { resolve } from 'path';
import { action as uploadAction, middleware as uploadMiddleware } from './actions/upload';
import { STORAGE_TYPE_LOCAL } from './constants';
import { getStorageConfig } from './storages';

export default class PluginFileManager extends Plugin {
  storageType() {
    return process.env.DEFAULT_STORAGE_TYPE;
  }

  async install() {
    const defaultStorageConfig = getStorageConfig(this.storageType());
    if (defaultStorageConfig) {
      const Storage = this.db.getCollection('storages');
      await Storage.repository.create({
        values: {
          ...defaultStorageConfig.defaults(),
          type: this.storageType(),
          default: true,
        },
      });
    }
  }

  async load() {
    await this.db.import({
      directory: resolve(__dirname, 'collections'),
    });

    // 暂时中间件只能通过 use 加进来
    this.app.resourcer.use(uploadMiddleware);
    this.app.resourcer.registerActionHandler('upload', uploadAction);

    if (process.env.NOCOBASE_ENV !== 'production') {
      await getStorageConfig(STORAGE_TYPE_LOCAL).middleware(this.app);
    }

    this.app.acl.allow('attachments', 'upload', 'loggedIn');
  }

  getName(): string {
    return this.getPackageName(__dirname);
  }
}
