import { DropzoneOptions } from 'react-dropzone'
import { NostrCheckServer } from './nostrcheck-server'
import { BaseError } from 'types'

export interface MediaOperations {
  post: (file: File) => Promise<string>
}
export type MediaStrategy = Omit<MediaOperations, 'auth'>

export interface MediaOption {
  name: string
  host: string
  type: 'nostrcheck-server' | 'route96'
}

// nostr.build based dropzone options
export const MEDIA_DROPZONE_OPTIONS: DropzoneOptions = {
  maxSize: 7000000,
  accept: {
    'image/*': ['.jpeg', '.png', '.jpg', '.gif', '.webp']
  }
}

export const MEDIA_OPTIONS: MediaOption[] = [
  // {
  //   name: 'nostr.build',
  //   host: 'https://nostr.build/',
  //   type: 'nostrcheck-server'
  // },
  {
    name: 'nostrcheck.me',
    host: 'https://nostrcheck.me/',
    type: 'nostrcheck-server'
  },
  {
    name: 'nostpic.com',
    host: 'https://nostpic.com/',
    type: 'nostrcheck-server'
  },
  {
    name: 'files.sovbit.host',
    host: 'https://files.sovbit.host/',
    type: 'nostrcheck-server'
  }
  // {
  //   name: 'void.cat',
  //   host: 'https://void.cat/',
  //   type: 'route96'
  // }
]

enum ImageErrorType {
  'TYPE_MISSING' = 'Media Option must include a type.'
}

export class ImageController implements MediaStrategy {
  post: (file: File) => Promise<string>

  constructor(mediaOption: MediaOption) {
    let strategy: MediaStrategy
    switch (mediaOption.type) {
      case 'nostrcheck-server':
        strategy = new NostrCheckServer(mediaOption.host)
        this.post = strategy.post
        break

      case 'route96':
        throw new Error('Not implemented.')

      default:
        throw new BaseError(ImageErrorType.TYPE_MISSING)
    }
  }
}