'use client';

import { PhotoIcon } from '@heroicons/react/24/outline';
import LoadingDots from 'components/loading-dots';
import { File as ShopifyFile } from 'lib/shopify/types';
import { ChangeEvent, useEffect, useId, useState, useTransition } from 'react';
import { getFileDetails } from './actions';

type FileInputProps = {
  name: string;
  label: string;
  fileId?: string | null;
};

const FileInput = ({ name, label, fileId }: FileInputProps) => {
  const id = useId();
  const [file, setFile] = useState<File | undefined>();
  const [defaultFileDetails, setDefaultFileDetails] = useState<ShopifyFile | undefined>();

  const [loading, startTransition] = useTransition();

  const onFileChange = (e: ChangeEvent<HTMLInputElement>) => {
    if (e.target.files && e.target.files.length > 0) {
      setFile(e.target.files[0]);
    }
  };

  useEffect(() => {
    if (!fileId) return;

    startTransition(async () => {
      const fileResponse = await getFileDetails(fileId);
      setDefaultFileDetails(fileResponse);
    });
  }, [fileId]);

  return (
    <div>
      <label className="block text-sm font-medium leading-6 text-gray-900">{label}</label>
      <div className="mt-2 flex justify-center rounded-lg border border-dashed border-gray-900/25 px-6 py-5">
        <div className="text-center">
          <PhotoIcon className="mx-auto h-12 w-12 text-gray-300" aria-hidden="true" />
          <div className="mt-2 flex text-sm leading-6 text-gray-600">
            <label
              htmlFor={id}
              className="relative cursor-pointer rounded-md bg-white font-semibold text-primary focus-within:outline-none focus-within:ring-2 focus-within:ring-primary/70 focus-within:ring-offset-2"
            >
              <span>Upload a file</span>
              <input id={id} name={name} type="file" className="sr-only" onChange={onFileChange} />
            </label>
            <p className="pl-1">or drag and drop</p>
          </div>
        </div>
      </div>
      <p className="mt-2 text-sm text-gray-500">
        {loading ? <LoadingDots className="bg-dark" /> : file?.name || defaultFileDetails?.alt}
      </p>
    </div>
  );
};

export default FileInput;