import { useEffect, useState } from 'react';
import { Card, CardActionArea, CardContent, CircularProgress, Typography } from '@mui/material';
import { useNavigate, useParams } from 'react-router';
import authManager from '../AuthManager';
import Conversation from '../../../model/Conversation';

export default function ConversationsOverviewCard(props) {
  const navigate = useNavigate();
  const accountId = props.accountId || useParams().accountId;
  const [loaded, setLoaded] = useState(false);
  const [conversations, setConversations] = useState([]);

  useEffect(() => {
    const controller = new AbortController();
    authManager
      .fetch(`/api/accounts/${accountId}/conversations`, { signal: controller.signal })
      .then((res) => res.json())
      .then((result) => {
        console.log(result);
        setLoaded(true);
        setConversations(Object.values(result).map((c) => Conversation.from(accountId, c)));
      });
    // return () => controller.abort() // crash on React18
  }, [accountId]);

  return (
    <Card onClick={() => navigate(`/account/${accountId}`)}>
      <CardActionArea>
        <CardContent>
          <Typography color="textSecondary" gutterBottom>
            Conversations
          </Typography>
          <Typography gutterBottom variant="h5" component="h2">
            {loaded ? conversations.length : <CircularProgress size={24} />}
          </Typography>
        </CardContent>
      </CardActionArea>
    </Card>
  );
}
