import {
  Box,
  Button,
  Card,
  CardBody,
  CardFooter,
  Container,
  Flex,
  Heading,
  Link,
  Stack,
  StackDivider,
  Text,
  VStack,
} from "@chakra-ui/react";
import { useLoaderData } from "@remix-run/react";
import { type ReactNode } from "react";

export async function loader({ context }: { context: RequestContext }) {
  const now = new Date();
  const monthEventList = await context.env.D1.prepare(
    "SELECT approved, created_by, day, month, pending, type, year FROM events WHERE month = ? AND year = ?;",
  )
    .bind(now.getUTCMonth() + 1, now.getUTCFullYear())
    .all();

  if (monthEventList.error)
    throw new Response(null, {
      status: 500,
    });

  return {
    can_approve: Boolean(
      [1 << 4, 1 << 12].find((p) => context.data.user.permissions & p),
    ),
    events: monthEventList.results,
  };
}

export default function () {
  const {
    can_approve,
    events,
  }: {
    can_approve: boolean;
    events: { [k: string]: any }[];
  } = useLoaderData<typeof loader>();
  const eventCards: ReactNode[] = [];

  for (const event of events) {
    eventCards.push(
      <Card w="100%">
        <CardBody>
          <Stack divider={<StackDivider />} spacing="4">
            <Box>
              <Heading size="sm">Date</Heading>
              <Text fontSize="sm" pt="2">
                {event.year}-{event.month}-{event.day}
              </Text>
            </Box>
            <Box>
              <Heading size="sm">Event Type</Heading>
              <Text fontSize="sm" pt="2">
                {event.type.toUpperCase()}
              </Text>
            </Box>
            <Box>
              <Heading size="sm">Host</Heading>
              <Text fontSize="sm" pt="2">
                {event.created_by}
              </Text>
            </Box>
          </Stack>
        </CardBody>
        <CardFooter>
          <Flex gap="16px">
            {can_approve && event.pending ? (
              <>
                <Button colorScheme="red">Deny</Button>
                <Button colorScheme="blue">Approve</Button>
              </>
            ) : null}
          </Flex>
          <Text alignSelf="center" fontSize="sm">
            Status:{" "}
            {event.pending ? "Pending" : event.approved ? "Approved" : "Denied"}
          </Text>
        </CardFooter>
      </Card>,
    );
  }

  return (
    <Container maxW="container.lg">
      <VStack spacing="8">{eventCards}</VStack>
      <Link color="#646cff" href="/book-event" mt="16px">
        Book an Event
      </Link>
      <br />
      <Link color="#646cff" href="/et-members" mt="8px">
        Events Team Member Management
      </Link>
    </Container>
  );
}