import React, { useEffect, useState } from "react";
import {
	Form,
	Button,
	Input,
	DatePicker,
	TimePicker,
	Row,
	Checkbox,
	Col,
	Upload,
	message,
	InputNumber,
	Modal
} from "antd";
import { VerticalAlignTopOutlined } from "@ant-design/icons";
import moment from "moment";
import "./style.css";
import { addEventService } from "../../utils/services";
import { _notification } from "../../utils/_helpers";
import ReactMarkdown from "react-markdown";

const { TextArea } = Input;
const { RangePicker } = DatePicker;

const CreateEvent = props => {
	const [isLoading, setIsLoading] = useState(false);
	const [fileList, setFileList] = useState(null);
	const [mdx, setMdx] = useState("");
	const [isModalVisible, setIsModalVisible] = useState(false);
	const [form] = Form.useForm();
	const [title, setTitle] = useState("");
	const [slug, setSlug] = useState("");

	useEffect(() => {
		form.setFieldsValue({
			maxRegister: 1
		});
		// eslint-disable-next-line react-hooks/exhaustive-deps
	}, []);

	const uploadprops = {
		name: "file",
		action: "https://www.api.dsckiet.com/dev",
		headers: {
			authorization: "authorization-text"
		},
		onChange(info) {
			if (info.file.status === "done") {
				message.success(`${info.file.name} file uploaded successfully`);
			} else if (info.file.status === "error") {
				message.error(`${info.file.name} file upload failed.`);
			}
			setFileList(info.fileList);
		}
	};

	function disabledDate(current) {
		// Can not select days before today and today
		return current && current < moment().endOf("day");
	}

	const handleSubmit = async values => {
		if (values.isRegistrationRequired === false) {
			values.isRegistrationOpened = false;
		}

		try {
			let xtime =
				values.startTime.format("h:mm a") +
				" to " +
				values.endTime.format("h:mm a");
			const formData = new FormData();
			formData.append("image", values.image.file.originFileObj);
			formData.append("title", title);
			formData.append("slug", slug);
			formData.append("description", values.description);
			formData.append("time", xtime);
			formData.append("venue", values.venue);
			formData.append("maxRegister", values.maxRegister);
			formData.append("startDate", values.dates[0].format("YYYY-MM-DD"));
			formData.append("endDate", values.dates[1].format("YYYY-MM-DD"));
			if (values.isRegistrationRequired === undefined) {
				formData.append("isRegistrationRequired", false);
			} else {
				formData.append(
					"isRegistrationRequired",
					values.isRegistrationRequired
				);
			}
			if (values.isRegistrationOpened === undefined) {
				formData.append("isRegistrationOpened", false);
			} else {
				formData.append(
					"isRegistrationOpened",
					values.isRegistrationOpened
				);
			}
			const res = await addEventService(formData);
			if (res.message === "success") {
				_notification("success", "Success", "Event Added");
				props.onAddEvent();
			} else {
				_notification("error", "Error", res.message);
			}
			setIsLoading(false);
		} catch (err) {
			_notification("error", "Error", err.message);
			setIsLoading(false);
		}
	};

	const handlePreview = () => {
		setIsModalVisible(!isModalVisible);
	};

	const slugify = text => {
		return text
			.replace(/ /g, "-")
			.replace(/[^\w-]+/g, "-")
			.replace(/-+/g, "-");
	};

	const renderers = {
		img: ({ alt, src, title }) => (
			<img
				alt={alt}
				src={src}
				title={title}
				style={{
					maxWidth: "100%",
					borderRadius: "8px",
					marginTop: "12px"
				}}
			/>
		)
	};

	return (
		<>
			<Form onFinish={handleSubmit} layout="vertical" form={form}>
				{/* <Form.Item
					label="Event Title"
					required
					name="title"
					rules={[
						{
							required: true,
							message: "Please input event title!"
						}
					]}
				> */}

				<Input
					required
					value={title ? title : ""}
					type="text"
					placeholder="Event title"
					onChange={e => {
						setTitle(e.target.value);
						setSlug(slugify(e.target.value));
					}}
					style={{ marginBottom: "20px" }}
				/>
				{/* </Form.Item> */}
				{/* <Form.Item
					label="Event Slug"
					required
					name="slug"
					rules={[
						{
							required: true,
							message: "Please input event slug!"
						}
					]}
				> */}
				<Input
					value={slug ? slug : ""}
					type="text"
					placeholder="Event slug"
					onChange={e => setSlug(slugify(e.target.value))}
					style={{ marginBottom: "20px" }}
				/>
				{/* </Form.Item> */}
				<Form.Item
					label="Description"
					required
					name="description"
					rules={[
						{
							required: true,
							message: "Please enter description!"
						}
					]}
				>
					<TextArea
						rows={4}
						placeholder="Enter event description"
						onChange={e => setMdx(e.target.value)}
					/>
				</Form.Item>
				<Form.Item>
					<Button type="primary" onClick={handlePreview}>
						Preview Event
					</Button>
				</Form.Item>
				<Form.Item
					label="Upload Picture"
					required
					name="image"
					rules={[
						{
							required: true,
							message: "Please select image!"
						}
					]}
				>
					<Upload
						{...uploadprops}
						fileList={fileList}
						listType="picture"
					>
						<Button>
							<VerticalAlignTopOutlined /> Click to Upload
						</Button>
					</Upload>
				</Form.Item>

				<Form.Item
					label="Event Venue"
					required
					name="venue"
					rules={[
						{
							required: true,
							message: "Please input event venue!"
						}
					]}
				>
					<Input type="text" placeholder="Event venue" />
				</Form.Item>

				<Form.Item
					label="Event Dates"
					required
					name="dates"
					rules={[
						{
							required: true,
							message: "Please select event dates!"
						}
					]}
				>
					<RangePicker
						style={{ width: "100%" }}
						disabledDate={disabledDate}
					/>
				</Form.Item>

				<Row gutter={16}>
					<Col span={12}>
						<Form.Item
							label="Start Time"
							required
							name="startTime"
							rules={[
								{
									required: true,
									message: "Please select event timings!"
								}
							]}
						>
							<TimePicker
								use12Hours
								format="h:mm a"
								style={{ width: "100%" }}
							/>
						</Form.Item>
					</Col>
					<Col span={12}>
						<Form.Item
							label="End Time"
							required
							name="endTime"
							rules={[
								{
									required: true,
									message: "Please select event timings!"
								}
							]}
						>
							<TimePicker
								use12Hours
								format="h:mm a"
								style={{ width: "100%" }}
							/>
						</Form.Item>
					</Col>
				</Row>

				<Row gutter={16}>
					<Col span={12}>
						<Form.Item
							valuePropName="checked"
							name="isRegistrationRequired"
						>
							<Checkbox>Is Registration Required?</Checkbox>
						</Form.Item>
					</Col>
					<Col span={12}>
						<Checkbox.Group>
							<Form.Item
								name="isRegistrationCompleted"
								valuePropName="checked"
							>
								<Checkbox>Is Registration Open?</Checkbox>
							</Form.Item>
						</Checkbox.Group>
					</Col>
				</Row>

				<Form.Item
					label="Max Registration"
					name="maxRegister"
					rules={[
						{
							required: true,
							message: "Please enter maximum registrations."
						}
					]}
				>
					<InputNumber min={1} />
				</Form.Item>

				<Form.Item>
					<Button
						type="primary"
						htmlType="submit"
						className="login-form-button"
						loading={isLoading}
					>
						Add Event
					</Button>
				</Form.Item>
			</Form>
			<Modal
				title="Desription Preview"
				visible={isModalVisible}
				footer={null}
				onCancel={() => setIsModalVisible(!isModalVisible)}
			>
				<ReactMarkdown components={renderers}>{mdx}</ReactMarkdown>
			</Modal>
		</>
	);
};

export default CreateEvent;