import {
  BrowserRouter,
  createBrowserRouter,
  Route,
  RouterProvider,
  Routes
} from 'react-router-dom';
import { useState, useEffect } from 'react';
import { Login } from './routes/Login';
import { staticRoutes } from './routes';
import { useOAuth, OAuthPopup } from './services/OAuth2';
import { BucketsListContext } from './services/BucketListContext';
import { useS3Service } from './services/S3APIService';
import { BucketBrowser } from './routes/BucketBrowser';
import { ListBucketsCommand, Bucket } from '@aws-sdk/client-s3';


function App() {

  const [bucketList, setBucketList] = useState<Bucket[]>([]);
  const oAuth = useOAuth();
  const s3 = useS3Service();

  useEffect(() => {
    if (!s3.isAuthenticated()) {
      return;
    }

    const listBucketCmd = new ListBucketsCommand({});
    s3.client.send(listBucketCmd)
      .then(response => {
        const { Buckets } = response;
        if (!Buckets) {
          console.warn("Warning: Expected Bucket[], got  undefined");
          return;
        }
        console.log(Buckets);
        setBucketList(Buckets);
      })
      .catch(err => {
        console.error(err);
      });
  }, [s3]);



  if (oAuth.error) {
    return <div>Ops... {oAuth.error.message}</div>;
  }

  console.log("Is user authenticated", oAuth.isAuthenticated)

  if (!oAuth.isAuthenticated) {
    return (
      <BrowserRouter>
        <Routes>
          <Route path="/" element={<Login onClick={oAuth.signinPopup} />} />
          <Route path="/callback" element={<OAuthPopup />} />
        </Routes>
      </BrowserRouter>
    )
  }

  let routes = staticRoutes.map(route => {
    return {
      path: route.path,
      element: route.element
    }
  });

  routes.push({
    path: "/login",
    element: <Login onClick={oAuth.signinPopup} />,
  });


  // Add /{bucket_name} routes dynamically
  routes = routes.concat(bucketList.reduce((acc: any[], bucket: Bucket) => {
    if (bucket.Name) {
      acc.push({
        path: "/" + bucket.Name,
        element: <BucketBrowser bucketName={bucket.Name} />
      });
    }
    return acc;
  }, []));

  const router = createBrowserRouter(routes);

  return (
    <div className="flex mb-4">
      <BucketsListContext.Provider value={bucketList}>
        <RouterProvider router={router} />
      </BucketsListContext.Provider>
    </div>
  )
}

export default App;