import { useState, useEffect } from "react";
import Input from "./Input";
import Button from "./Button";
import { useNavigate, useParams } from "react-router-dom";
import axios from "axios";

function HomeParticipateForm() {
    const [name, setName] = useState("");
    const [password, setPassword] = useState("");
    const [email, setEmail] = useState("");
    const navigate = useNavigate();
    const { id } = useParams();


    const handleName = (event) => {
        setName(event.target.value);
    }
    const handlePassword = (event) => {
        setPassword(event.target.value);
    }
    const handleEmail = (event) => {
        setEmail(event.target.value);
    }
    const checkParticipantExistence = async () => {
        try {
            const response = await axios.get(`http://localhost:3000/meetings/${id}/participants/?name=${name}`);
            return false;
        }
        catch (err) {
            return true;
        }
    }

    const handleSubmit = async (event) => {
        event.preventDefault();
        if (name === "") {
            alert('이름을 입력하세요')
        }
        else {
            let checkParticipant = await checkParticipantExistence();
            console.log(checkParticipant);
            if (checkParticipant) { // DB에 해당 이름이 존재하지 않으면
                try {
                    const response = await axios.post(`http://localhost:3000/meetings/${id}/participants`, {
                        name: name,
                        password: password,
                        email: email
                    });
                    try {
                        const response = await axios.post(`http://localhost:3000/meetings/${id}/entry`, {
                            name: name,
                            password: password
                        }, {
                            withCredentials: true
                        });

                        try {
                            const response = await axios.get(`http://localhost:3000/meetings/${id}/`);
                            const startDate = response.data.startDate;
                            const endDate = response.data.endDate;
                            const startTime = response.data.availableVotingStartTime;
                            const endTime = response.data.availableVotingEndTime;
                            try {
                                const response = await axios.get(`http://localhost:3000/meetings/${id}/my/schedules`);
                                // console.log(startDate, endDate);
                                navigate('UserTimeInfo', { state: { id: id, startTime: startTime, endTime: endTime, startDate: startDate, endDate: endDate, schedules: response.data.schedules } });
                            }
                            catch (e) {
                                console.log(e);
                            }
                        }
                        catch (e) {
                            console.log(e);
                        }
                    }
                    catch (error) {
                        if (error.response) {
                            if (error.response.status === 401) {
                                alert('Password를 잘못 입력하였습니다');
                            } else if (error.response.status === 404) {
                                alert('해당하는 이름이 존재하지 않습니다');
                            }
                            else if (error.response.status === 400) {
                                alert("비밀번호를 설정하셨습니다. 비밀번호를 입력해주세요")
                            }
                            else {
                                alert(`Unexpected status code: ${error.response.status}`);
                            }
                        } else {
                            console.error(error);
                        }
                    }
                }
                catch (error) {
                    console.error(error);
                }
            }
            else { // 이미 DB에 참여자가 존재하는 경우
                try {
                    await axios.post(`http://localhost:3000/meetings/${id}/entry`, {
                        name: name,
                        password: password
                    }, {
                        withCredentials: true
                    });
                    const response = await axios.get(`http://localhost:3000/meetings/${id}/my/schedules`); //투표 여부 확인을 위해
                    const schedules = response.data.schedules;
                    if (schedules.length) { // 투표를 진행하였으면 결과 페이지로 이동
                        navigate(`/result/${id}`);
                    }
                    else { // 투표를 안했으면 투표페이지로 이동
                        try { // 쿠키 재생성
                            try {
                                const response = await axios.get(`http://localhost:3000/meetings/${id}/`);
                                const startDate = response.data.startDate;
                                const endDate = response.data.endDate;
                                const startTime = response.data.availableVotingStartTime;
                                const endTime = response.data.availableVotingEndTime;
                                navigate('UserTimeInfo', { state: { id: id, startTime: startTime, endTime: endTime, startDate: startDate, endDate: endDate, schedules: schedules } });
                            }
                            catch (e) {
                                console.log(e);
                            }
                        }
                        catch (error) {
                            if (error.response) {
                                if (error.response.status === 401) {
                                    alert('Password를 잘못 입력하였습니다');
                                } else if (error.response.status === 404) {
                                    alert('해당하는 이름이 존재하지 않습니다');
                                }
                                else if (error.response.status === 400) {
                                    alert("비밀번호를 설정하셨습니다. 비밀번호를 입력해주세요")
                                }
                                else {
                                    alert(`Unexpected status code: ${error.response.status}`);
                                }
                            } else {
                                console.error(error);
                            }
                        }
                    }
                }
                catch (error) {
                    if (error.response) {
                        if (error.response.status === 401) {
                            alert('Password를 잘못 입력하였습니다');
                        } else if (error.response.status === 404) {
                            alert('해당하는 이름이 존재하지 않습니다');
                        }
                        else if (error.response.status === 400) {
                            alert("비밀번호를 설정하셨습니다. 비밀번호를 입력해주세요")
                        }
                        else {
                            alert(`Unexpected status code: ${error.response.status}`);
                        }
                    } else {
                        console.error(error);
                    }
                }
            }
        }
    };

    return (
        <form>
            <div>
                <h1>투표에 참여하기</h1>
                <Input
                    type="text"
                    value={name}
                    onChange={handleName}
                    placeholder="이름"
                />
                <Input
                    type="password"
                    value={password}
                    onChange={handlePassword}
                    placeholder="Password(선택)"
                />
                <Input
                    type="text"
                    value={email}
                    onChange={handleEmail}
                    placeholder="이메일(선택)"
                />
                <Button
                    type='submit'
                    text='참여'
                    onClick={handleSubmit}
                />
            </div>
        </form>
    );
}

export default HomeParticipateForm;