import React, { useState, useEffect } from 'react';
import { BrowserRouter as Router, Switch, Route, Link, useParams } from 'react-router-dom';
import './light.css';
import { Button, Label, Container, Divider, Dropdown, Form, Grid, Header, Icon, Image, Menu, Message, Segment, Table } from 'semantic-ui-react';
import moment from 'moment-timezone';
import { isInstructor, getInstructor, requester } from './utils.js';
import { NotFound, PleaseLogin } from './Misc.js';
import { InstructorCourseList, InstructorCourseDetail } from './InstructorCourses.js';
import { InstructorClassList } from './InstructorClasses.js';

export const tags = {
	Protospace: 'black',
	Laser: 'red',
	Wood: 'brown',
	CNC: 'orange',
	Niche: 'yellow',
	//name: 'olive',
	Electronics: 'green',
	Computers: 'teal',
	Metal: 'blue',
	//name: 'violet',
	Event: 'purple',
	Outing: 'pink',
	Misc: 'grey',
};

let courseCache = false;
let tagFilterCache = false;

export function Courses(props) {
	const [courses, setCourses] = useState(courseCache);
	const [tagFilter, setTagFilter] = useState(tagFilterCache);
	const { token, user } = props;

	useEffect(() => {
		requester('/courses/', 'GET', token)
		.then(res => {
			setCourses(res.results);
			courseCache = res.results;
		})
		.catch(err => {
			console.log(err);
		});
	}, []);

	const byTag = (x) => tagFilter ? x.tags.includes(tagFilter) : true;

	return (
		<Container>
			<Header size='large'>Courses</Header>

			{isInstructor(user) && <Segment padded>
				<InstructorCourseList courses={courses} setCourses={setCourses} {...props} />
			</Segment>}

			<p>
				Filter by tag:
				<div className='coursetags'>
					{Object.entries(tags).map(([name, color]) =>
						<Label
							onClick={() => {
								setTagFilter(name);
								tagFilterCache = name;
							}}
							as='a'
							color={color}
							tag
						>
							{name}
						</Label>
					)}
				</div>
			</p>
			<p>
				{tagFilter && <Button
					onClick={() => {
						setTagFilter(false);
						tagFilterCache = false;
					}}
				>
					Clear {tagFilter} filter
				</Button>}
			</p>

			{courses ?
				<Table basic='very'>
					<Table.Header>
						<Table.Row>
							<Table.HeaderCell>Name</Table.HeaderCell>
							<Table.HeaderCell></Table.HeaderCell>
						</Table.Row>
					</Table.Header>

					<Table.Body>
						{courses.length ?
							courses.filter(byTag).map(x =>
								<Table.Row key={x.id}>
									<Table.Cell>
										<Link to={'/courses/'+x.id}>{x.name}</Link>
									</Table.Cell>
									<Table.Cell>
										{!!x.tags && x.tags.split(',').map(name =>
											<Label color={tags[name]} tag>
												{name}
											</Label>
										)}
									</Table.Cell>
								</Table.Row>
							)
						:
							<Table.Row><Table.Cell>None</Table.Cell></Table.Row>
						}
					</Table.Body>
				</Table>
			:
				<p>Loading...</p>
			}

		</Container>
	);
};

export function CourseDetail(props) {
	const [course, setCourse] = useState(false);
	const [error, setError] = useState(false);
	const { token, user } = props;
	const { id } = useParams();

	useEffect(() => {
		requester('/courses/'+id+'/', 'GET', token)
		.then(res => {
			setCourse(res);
		})
		.catch(err => {
			console.log(err);
			setError(true);
		});
	}, []);

	const now = new Date().toISOString();

	return (
		<Container>
			{!error ?
				course ?
					<div>
						<Header size='large'>{course.name}</Header>

						{isInstructor(user) && <Segment padded>
							<InstructorCourseDetail course={course} setCourse={setCourse} {...props} />
						</Segment>}

						<Header size='medium'>Course Description</Header>
						{course.is_old ?
							course.description.split('\n').map((x, i) =>
								<p key={i}>{x}</p>
							)
						:
							<div dangerouslySetInnerHTML={{__html: course.description}} />
						}

						<Header size='medium'>Classes</Header>

						{isInstructor(user) && <Segment padded>
							<InstructorClassList course={course} setCourse={setCourse} {...props} />
						</Segment>}

						<Table basic='very'>
							<Table.Header>
								<Table.Row>
									<Table.HeaderCell>Date</Table.HeaderCell>
									<Table.HeaderCell>Time</Table.HeaderCell>
									<Table.HeaderCell>Instructor</Table.HeaderCell>
									<Table.HeaderCell>Cost</Table.HeaderCell>
									<Table.HeaderCell>Students</Table.HeaderCell>
								</Table.Row>
							</Table.Header>

							<Table.Body>
								{course.sessions.length ?
									course.sessions.sort((a, b) => a.datetime < b.datetime ? 1 : -1).slice(0,10).map(x =>
										<Table.Row key={x.id} active={x.datetime < now || x.is_cancelled}>
											<Table.Cell>
												<Link to={'/classes/'+x.id}>
													&nbsp;{moment.utc(x.datetime).tz('America/Edmonton').format('ll')}
												</Link>
											</Table.Cell>
											<Table.Cell>{x.is_cancelled ? 'Cancelled' : moment.utc(x.datetime).tz('America/Edmonton').format('LT')}</Table.Cell>
											<Table.Cell>{getInstructor(x)}</Table.Cell>
											<Table.Cell>{x.cost === '0.00' ? 'Free' : '$'+x.cost}</Table.Cell>
											<Table.Cell>
												{!!x.max_students ?
													x.max_students <= x.student_count ?
														'Full'
													:
														x.student_count + ' / ' + x.max_students
												:
													x.student_count
												}
											</Table.Cell>
										</Table.Row>
									)
								:
									<Table.Row><Table.Cell>None</Table.Cell></Table.Row>
								}
							</Table.Body>
						</Table>
					</div>
				:
					<p>Loading...</p>
			:
				<NotFound />
			}
		</Container>
	);
};