import React, { useState } from 'react';
import { makeStyles } from '@material-ui/core/styles';
import {
  Card,
  CardHeader,
  CardContent,
  CardActions,
  Collapse,
  IconButton,
  Button,
} from '@material-ui/core';
import {
  FiberManualRecord as RunningIcon,
  Close as FailedIcon,
  Done as CompleteIcon,
  Timer as NotStartedIcon,
  ExpandMore as ExpandIcon
} from '@material-ui/icons';
import Logs from './Logs';
import { Event } from '../../types';
import requests from '../../requests';
import { useAuth } from '../../hooks/useAuth';

interface PropTypes {
  event: Event;
  mutate: () => void;
}

const useStyles = makeStyles(theme => ({
  actions: {
    display: 'flex',
    justifyContent: 'space-between'
  },
  title: {
    display: 'flex',
    alignItems: 'center',
    justifyContent: 'flex-start',
    '& svg': {
      marginLeft: theme.spacing(1)
    }
  },
  running: {
    color: theme.palette.warning.main
  },
  complete: {
    color: theme.palette.success.main
  },
  logs: {
    maxHeight: theme.spacing(40),
    overflowY: 'scroll'
  }
}));


const EventCard: React.FC<PropTypes> = ({ event, mutate }) => {
  const [expanded, setExpanded] = useState<boolean>(false);
  const classes = useStyles();
  const { user } = useAuth();
  const {
    name,
    schedule,
    status,
    nextRunAt,
    lastRunAt,
    context: {
      participants,
      conferenceId,
      attendanceId
    }
  } = event;

  const joined = participants.findIndex(x => x === user?.username) >= 0;

  const handleJoin = () => {
    if (user) {
      const { context } = event;
      context.participants.push(user.username);

      return requests
        .patch(`/events/${event._id}`, { context })
        .then(() => mutate());
    }
  };

  const handleRemove = () => {
    return requests
      .delete(`/events/${event._id}`)
      .then(() => mutate());
  };

  const toggleExpand = () => setExpanded(v => !v);

  const title = (
    <div className={classes.title}>
      {name}
      {status === 'running' && <RunningIcon className={classes.running}/>}
      {status === 'complete' && <CompleteIcon className={classes.complete} />}
      {status === 'failed' && <FailedIcon color="error" />}
      {status === 'notStarted' && <NotStartedIcon color="disabled" />}
    </div>
  );

  return (
    <Card variant="outlined">
      <CardHeader title={title} subheader={schedule} />
      <CardContent>
        {nextRunAt && <div> Next run at: {new Date(nextRunAt).toLocaleTimeString()} </div>}
        {lastRunAt && <div> Last run at: {new Date(lastRunAt).toLocaleTimeString()} </div>}
        {conferenceId && <div> ConferenceID: {conferenceId} </div>}
        {attendanceId && <div> AttendanceID: {attendanceId} </div>}
        <div>
          Participants ({participants?.length || 0} / 3)
          <ul>
            {participants?.map(username => (
              <li> {username} {username === user?.username && <b>(you)</b>} </li>
            ))}
          </ul>
        </div>
      </CardContent>
      <CardActions className={classes.actions}>
        <div>
          <Button
            onClick={handleRemove}
            color="primary"
            size="large"
          >
            Remove
          </Button>
          {!joined && (participants?.length || 0) < 3 && (
            <Button
              onClick={handleJoin}
              variant="contained"
              color="primary"
              size="large"
            >
              Join
            </Button>
          )}
        </div>
        <IconButton onClick={toggleExpand}>
          <ExpandIcon />
        </IconButton>
        </CardActions>
        <Collapse in={expanded} className={classes.logs}>
          <Logs eventId={event._id} />
        </Collapse>
    </Card>
  );
};

export default EventCard;
