import * as React from 'react'
import { Units } from '../defy/models'
import { DayDetails } from '../ch/models'
import { useDrop } from 'react-dnd'
import ItemTypes from '../ch/ItemTypes'
import { WorkoutCard } from './WorkoutCard'
import { BlankCard } from './BlankCard'
import styled from 'styled-components'
import { Overlay } from './Overlay'

interface Props {
    dayDetails: DayDetails | undefined,
    date: Date,
    units: Units,
    swap: (d1: Date, d2: Date) => void,
    selected: boolean,
    hovering: boolean,
}

type DropTargetProps = {
    isOver: boolean,
    canDrop: boolean,
}

const DropTarget = styled.div<DropTargetProps>`
    height: 100%;
    opacity: ${props => props.isOver ? 0.5 : 1};
`;

export const DayCell: React.FC<Props> = ({ dayDetails, date, units, swap, selected, hovering, }) => {

    function canSwap(d1: Date) {
        return dayDetails !== undefined;
    }

    const [{ isOver, canDrop, droppedItem }, drop] = useDrop({
        accept: ItemTypes.DAY,
        canDrop: () => canSwap(date),
        drop: () => { swap(date, droppedItem.date); return; },
        collect: (monitor) => ({
            isOver: monitor.isOver(),
            canDrop: monitor.canDrop(),
            droppedItem: monitor.getItem()
        }),
    })

    return (
        <div style={{
            position: 'relative',
            width: '100%',
            height: '100%',
        }}>
            <DropTarget isOver={isOver} canDrop={canDrop} ref={drop}>
                {dayDetails && <WorkoutCard dayDetails={dayDetails} date={date} units={units} swap={swap} />}
                {!dayDetails && <BlankCard date={date} />}
                {isOver && !canDrop && <Overlay color="pink" />}
                {isOver && canDrop && <Overlay color="lightgreen" />}

                {dayDetails && selected && <Overlay color="pink" />}
                {dayDetails && !selected && hovering && <Overlay color="lightgreen" />}
            </DropTarget>
        </div>
    );
}