import React, { useState } from 'react'
import jsPDF from 'jspdf';
import html2canvas from 'html2canvas';

/*Estilos*/
import './style.css'
import './style-certificate.css'
import 'antd/dist/antd.css';
import { Checkbox, Button, Input, message, Table, Tag, Popover, Popconfirm } from 'antd';

import { UserAddOutlined } from '@ant-design/icons';

/*Animação de tela enquanto o e-mail é enviado*/
import Spinner from 'react-spinkit' 
import './style-spinkit.css'

/*Importando lista de participantes*/
import participantesData from '../../services/participantes.json'

import stars from '../../assets/stars.png'
import logo from '../../assets/img/logo_texto_preto.png'

function ListOfPresents(props) {

		/*Recebe o evento selecionado pelo organizador*/
		const { evento } = props

		/*Nome do novo participante no input*/
		const [ name, setName ] = useState('')

		/*E-mail do novo participante no input*/
		const [ email, setEmail ] = useState('')

		/*JSON dos participantes*/
		const [ participantes, setParticipantes ] = useState(participantesData)

		/*Variavel que troca a lista de participants pelos certificados*/
		const [ visible, setVisible ] = useState(true)

		/*Variavel que troca a lista de participants pelos formulário*/
		const [ visibleForm, setVisibleForm ] = useState(false)

		/*Participante selecionado*/
		const [ thisParticipante, setThisParticipante ] = useState('')

		/*Variavel que mostrará uma animação enquanto o e-mail é enviado*/
		const [ loadingEmail, setLoadingEmail] = useState(false)

		/*------- Informações adicionais sobre o evento ------*/
		let numeroDeParticipantes = 0
		let certificadosEvenviados = 0
		let participantesConfirmados = 0

		const showModal = (participante) => {
			setVisible(false)
			setThisParticipante(participante)
		}

		/*Valida os campos de input*/
		const verificarCampos = () => {
			if(!name || !email ) {
				message.error('Por favor, preencha todos os campos')

			} else {

				/*Verificando se o e-mail é valido */
			    if( !email.includes('@') || !email.includes('.') ){
			    	message.error('E-mail invalido!')

			    } else {
			    	
			    	/*Verificando se já existe um participante cadastrado*/
				    let listEmails = []

				    participantes.map(itemJson => {

				    	if(itemJson.course === evento.course) {
				    		listEmails.push(itemJson.email)
				    	}
				    })

				    if(!listEmails.includes(email)) {
						
						setParticipantes([
							...participantes, {
								name: name,
								email: email,
								present: true,
								receiveCertificate: false,
								course: evento.course
							}
						])

						/*Volta para a lista de participntes*/
						setVisibleForm(false)
						message.success('Participante criado com sucesso')
						setName('')
						setEmail('')

					} else {

						message.warning('Este participante já está na sua lista')
					}
			    }
			}
		}

		/* ------------- Deletando Participantes ---------------*/
		const deleteParticipant = (participantToBeDeleted) => {

			setParticipantes( participantes.filter(participante => {
				if(participante.name !== participantToBeDeleted) {
					return participante
				}
			}))
		}

		/*Na mudança de check do participante*/
		const onChange = (participante) => {

			setParticipantes(participantes.map(itemParticipante => {
				
				if(itemParticipante.name === participante.name) {
					itemParticipante['present'] = !participante.present

					if(participante.present) {
						message.success('Este participante receberá certificado')

					} else {
						message.info('Este participante não receberá certificado')
					}

					return itemParticipante;
				} else {

					return itemParticipante;
				}
				
			}))
		}
    	
    	/*Função destinada ao envio de e-mail, recebe o e-mail do participante*/
		const sendEmail = (to) =>{	

			/*Este e-mail enviará os certificados*/
			let from = "[email protected]"

			setLoadingEmail(true)
			const input = document.getElementsByClassName('certificate-background')[0];
			window.scrollTo(0,0);
			html2canvas(input, {
					windowWidth: input.scrollWidth,
					windowHeight: input.scrollHeight
				})
				.then((canvas) => {
					const imgData = canvas.toDataURL('image/png');
					const pdf = new jsPDF('l', 'mm', 'a4', true);

					pdf.addImage(imgData, 'PNG', 3, 3, 380, 265, '', 'SLOW');
					var formData = new FormData();
					formData.append('file', new Blob([pdf.output('blob')], {type: 'application/pdf'}), "certificado.pdf");
					formData.append('from', from);
					formData.append('to', to);

					fetch('http://localhost:8080/send-mail', {
						method: 'POST',
						body: formData,
					})
					.then(success =>  message.success("Email enviado com sucesso!"))
					.then(before => setLoadingEmail(false))
					.catch(error => message.error("Não foi possível enviar seu email!")
					.then(before => setLoadingEmail(false))
					);
				});

			

			setParticipantes(participantes.map(itemParticipante => {
				
				/*Buscando o participante que recebeu o email*/
				if(itemParticipante.email === to) {

					itemParticipante['receiveCertificate'] = true
					return itemParticipante;

				} else {

					return itemParticipante;
				}
				
			}))

		}

		const dataSource = []

		/*Preenchendo lista de participantes*/
		participantes.map((participante, key) => {
			if(participante.course === evento.course) {

				let statusCertificate = ''
				let statusPresense = ''
				let colorCertificate = ''
				let colorPresense = ''

				/*Verifica se o participante recebeu certificado*/
				statusCertificate = (participante.receiveCertificate) ? 'Enviado' : 'Não Enviado'
				colorCertificate = (participante.receiveCertificate) ? 'green' : 'orange'

				/*Verifica se o participante está confirmado no evento*/
				statusPresense = (participante.present) ? 'Confirmada' : 'Não Confirmado'
				colorPresense = (participante.present) ? 'green' : 'red'

				dataSource.push({
					key: key,
					checkbox: <Checkbox 
									checked={participante.present} 
									onChange={() => onChange(participante) }>
							   </Checkbox>,

    				participante: participante.name,

    				email: participante.email,

   					status: <Tag color={colorCertificate}>{statusCertificate}</Tag>,

   					presense: <Tag color={colorPresense}>{statusPresense}</Tag>,

   					certificado: <Button 
   									type="primary" 
   									disabled={!participante.present} 
   									className="buttom-ver-certificado" 
   									onClick={() => showModal(participante)}>
									Acessar 
								</Button>,

					delete:
							<Popconfirm 
								title="Você tem certeza de que quer excluir este participante?"
								onConfirm={() => deleteParticipant(participante.name) }
								okText="Sim"
								cancelText="Não"
							>
								<Button danger 
									className="button-delete" 
								> X 
								</Button>
							</Popconfirm>
    			})
			}

		})

		const columns = [
		  {
		  	title: 'Atualizar Presença',
		  	dataIndex: 'checkbox',
		  	key: 'checkbox'
		  },
		  {
		    title: 'Participante',
		    dataIndex: 'participante',
		    key: 'participante',
		  },
		  {
		    title: 'E-mail',
		    dataIndex: 'email',
		    key: 'email',
		  },
		  {
		    title: 'Status',
		    dataIndex: 'status',
		    key: 'status',
		  },
		  {
		    title: 'Presença',
		    dataIndex: 'presense',
		    key: 'presense',
		  },
		  ,
		  {
		    title: 'Certificado',
		    dataIndex: 'certificado',
		    key: 'certificado',
		  }
		  ,
		  {
		    title: 'Excluir da lista',
		    dataIndex: 'delete',
		    key: 'delete',
		  }
		];

		return (
			<>
				<div className="list-participants" style={{ display: visible ?  'grid' : 'none' }} >
					<div className="input-participantes" style={{ display: visibleForm ?  'grid' : 'none' }}>
						<h2>Adicione mais participantes a sua lista:</h2>
						<Input className="input-1" placeholder="Nome do participante" value={name} onChange={newName => setName(newName.target.value)}/>
						<br/>
						<Input className="input-2" placeholder="E-mail do participante" value={email} onChange={newEmail => setEmail(newEmail.target.value)}/>
						<br/>
						<Button className="button-parcipants" type="primary" danger onClick={() => {verificarCampos()}}>Incluir novo participante</Button>
						<Button className="buttom-voltar-participants" onClick={ () => setVisibleForm(false) }>Voltar para a lista</Button>
					</div>

					<div style={{ display: visibleForm ?  'none' : 'block' }}>
						<Button className="button-add-participant" onClick={ () => setVisibleForm(true) }><UserAddOutlined/>Incluir participante</Button>

						<h1 className="title-2">Lista de Participantes</h1>
						<Popover content={<h5>Click para enviar certificados para todos os participantes</h5>}>
							<Button className="buttom-send-to-all">Enviar para todos</Button>
						</Popover>

						<Popover content={<h5>Click para cancelar a presença de todos os participantes</h5>}>
							<Button className="buttom-cancel">Cancelar todos</Button>
						</Popover>
						<Table dataSource={dataSource} columns={columns} />
					</div>				
				
				</div>
				<div style={{ display: visible ?  'none' : 'grid' }}>

					{ loadingEmail && 
						<div className='overlay-content'> 
							<Spinner name="ball-grid-pulse" color="white"/>
						</div>}
					
					<div className="certificate-background">
						<img src={logo} alt="Logo da empresa" className="img-logo-certificate"/>
						<img src={stars} alt="5 estrelas" className="img-stars"/> 
						<p className="p-certificate">A comunidade <span className="info-certificate">{evento.company}</span> confere ao participante <span className="info-certificate">{thisParticipante.name}</span> o presente certificado 
							<br/>referente a sua participação no evento <span className="info-certificate">{evento.course}</span> realizado do 
							<br/>dia <span className="info-certificate">{evento.startDate}</span> ao <span className="info-certificate">{evento.finishDate}</span>, com carga horaria de <span className="info-certificate">{evento.workload} horas.</span>
							<br/>
						</p>
						<img alt="Assinatura Digital" src={evento.digitalSignature} className="digitalSignature" />
						<hr/>
						<p className="p-2-certificate">{evento.user}</p>
					</div>

					<Button className="button-email" type="primary" onClick={() => sendEmail(thisParticipante.email)}>Enviar certificado</Button>
					<Button className="button-voltar" onClick={ () => setVisible(true) }>Voltar para a lista de participantes</Button>
				</div>
			</>
		);
}

export default ListOfPresents;