import { useRef, useState } from 'react'
import AvatarEditor from 'react-avatar-editor'
import Button from 'react-bootstrap/Button'
import BootstrapForm from 'react-bootstrap/Form'
import EditImage from '@/svgs/image-edit-fill.svg'
import Moon from '@/svgs/moon-fill.svg'
import { useShowModal } from './modal'
import { ImageUpload } from './image'

export default function Avatar ({ onSuccess }) {
  const [uploading, setUploading] = useState()
  const showModal = useShowModal()

  const Body = ({ onClose, file, upload }) => {
    const [scale, setScale] = useState(1)
    const ref = useRef()

    return (
      <div className='text-end mt-1 p-4'>
        <AvatarEditor
          ref={ref} width={200} height={200}
          image={file}
          scale={scale}
          style={{
            width: '100%',
            height: 'auto'
          }}
        />
        <BootstrapForm.Group controlId='formBasicRange'>
          <BootstrapForm.Range
            onChange={e => setScale(parseFloat(e.target.value))}
            min={1} max={2} step='0.05'
            // defaultValue={scale}
          />
        </BootstrapForm.Group>
        <Button
          onClick={() => {
            ref.current.getImageScaledToCanvas().toBlob(blob => {
              if (blob) {
                upload(blob)
                onClose()
              }
            }, 'image/jpeg')
          }}
        >save
        </Button>
      </div>
    )
  }

  return (
    <ImageUpload
      avatar
      onError={e => {
        console.log(e)
        setUploading(false)
      }}
      onSelect={(file, upload) => {
        return new Promise((resolve, reject) =>
          showModal(onClose => (
            <Body
              onClose={() => {
                onClose()
                resolve()
              }}
              file={file}
              upload={async (blob) => {
                await upload(blob)
                resolve(blob)
              }}
            />
          )))
      }}
      onSuccess={({ id }) => {
        onSuccess?.(id)
        setUploading(false)
      }}
      onUpload={() => {
        setUploading(true)
      }}
    >
      <div className='position-absolute p-1 bg-dark pointer' style={{ bottom: '0', right: '0' }}>
        {uploading
          ? <Moon className='fill-white spin' />
          : <EditImage className='fill-white' />}
      </div>
    </ImageUpload>
  )
}