import { QuizQuestionRating } from "@model/questionTypes/rating";
import { Box, ButtonBase, Slider, Tooltip, Typography, useMediaQuery, useTheme } from "@mui/material";
import { setQuestionInnerName, updateQuestion } from "@root/questions/actions";
import CustomCheckbox from "@ui_kit/CustomCheckbox";
import CustomTextField from "@ui_kit/CustomTextField";
import { useDebouncedCallback } from "use-debounce";
import InfoIcon from "../../../assets/icons/InfoIcon";
import FlagIcon from "../../../assets/icons/questionsPage/FlagIcon";
import StarIconMini from "../../../assets/icons/questionsPage/StarIconMini";
import HashtagIcon from "../../../assets/icons/questionsPage/hashtagIcon";
import HeartIcon from "../../../assets/icons/questionsPage/heartIcon";
import LightbulbIcon from "../../../assets/icons/questionsPage/lightbulbIcon";
import LikeIcon from "../../../assets/icons/questionsPage/likeIcon";
import TropfyIcon from "../../../assets/icons/questionsPage/tropfyIcon";
import type { ButtonRatingFrom } from "./RatingOptions";


type SettingSliderProps = {
    question: QuizQuestionRating;
};

export default function SettingSlider({ question }: SettingSliderProps) {
    const theme = useTheme();
    const isFigmaTablte = useMediaQuery(theme.breakpoints.down(990));
    const isMobile = useMediaQuery(theme.breakpoints.down(790));
    const isWrappColumn = useMediaQuery(theme.breakpoints.down(980));

    const setInnerName = useDebouncedCallback((value) => {
        setQuestionInnerName(question.id, value);
    }, 200);

    const buttonRatingForm: ButtonRatingFrom[] = [
        { name: "star", icon: <StarIconMini color={theme.palette.grey3.main} /> },
        { name: "trophie", icon: <TropfyIcon color={theme.palette.grey3.main} /> },
        { name: "flag", icon: <FlagIcon color={theme.palette.grey3.main} /> },
        { name: "heart", icon: <HeartIcon color={theme.palette.grey3.main} /> },
        { name: "like", icon: <LikeIcon color={theme.palette.grey3.main} /> },
        {
            name: "bubble",
            icon: <LightbulbIcon color={theme.palette.grey3.main} />,
        },
        { name: "hashtag", icon: <HashtagIcon color={theme.palette.grey3.main} /> },
    ];

    return (
        <Box
            sx={{
                display: "flex",
                justifyContent: "space-between",
                flexDirection: isWrappColumn ? "column" : null,
            }}
        >
            <Box
                sx={{
                    pt: isMobile ? "25px" : "20px",
                    pb: isMobile ? "25px" : "20px",
                    pl: "20px",
                    display: "flex",
                    flexDirection: "column",
                    gap: "14px",
                    maxWidth: "340px",
                    width: "100%",
                }}
            >
                <Typography sx={{ height: isMobile ? "18px" : "auto", fontWeight: "500", fontSize: "18px", color: " #4D4D4D" }}>
                    Настройки рейтинга
                </Typography>
                <Typography
                    sx={{
                        color: theme.palette.grey2.main,
                        fontSize: "16px",
                        fontWeight: 400,
                    }}
                >
                    Форма
                </Typography>
                <Box sx={{ display: "flex", marginBottom: "15px" }}>
                    {buttonRatingForm.map(({ name, icon }, index) => (
                        <ButtonBase
                            key={index}
                            onClick={() => {
                                updateQuestion(question.id, question => {
                                    if (question.type !== "rating") return;

                                    question.content.form = name;
                                });
                            }}
                            sx={{
                                backgroundColor:
                                    question.content.form === name
                                        ? theme.palette.brightPurple.main
                                        : "transparent",
                                color:
                                    question.content.form === name
                                        ? "#ffffff"
                                        : theme.palette.grey3.main,
                                width: "40px",
                                height: "40px",
                                borderRadius: "4px",
                            }}
                        >
                            {icon}
                        </ButtonBase>
                    ))}
                </Box>

                <Typography
                    sx={{
                        color: theme.palette.grey2.main,
                        fontSize: "16px",
                        fontWeight: 400,
                    }}
                >
                    Количество
                </Typography>
                <Slider
                    value={question.content.steps}
                    min={2}
                    max={10}
                    aria-label="Default"
                    valueLabelDisplay="auto"
                    sx={{ color: theme.palette.brightPurple.main, padding: "0" }}
                    onChange={(_, value) => {
                        updateQuestion(question.id, question => {
                            if (question.type !== "rating") return;

                            question.content.steps = Number(value) || 1;
                        });
                    }}
                />
            </Box>
            <Box
                sx={{
                    boxSizing: "border-box",
                    pt: isMobile ? "30px" : "20px",
                    pb: "20px",
                    pl: isFigmaTablte ? (isMobile ? "20px" : "34px") : "40px",
                    pr: isFigmaTablte ? "19px" : "20px",
                    display: "flex",
                    flexDirection: "column",
                    gap: isMobile ? "13px" : "14px",
                    width: "100%",
                }}
            >
                <Typography sx={{ height: isMobile ? "18px" : "auto", fontWeight: "500", fontSize: "18px", color: " #4D4D4D" }}>
                    Настройки вопросов
                </Typography>
                <CustomCheckbox
                    sx={{ display: "block", mr: isMobile ? "0px" : "16px" }}
                    label={"Необязательный вопрос"}
                    checked={!question.required}
                    handleChange={(e) => {
                        updateQuestion(question.id, question => {
                            if (question.type !== "rating") return;

                            question.required = !e.target.checked;
                        });
                    }}
                />
                <Box
                    sx={{
                        width: isMobile ? "90%" : "auto",
                        display: "flex",
                        alignItems: "center",
                    }}
                >
                    <CustomCheckbox
                        sx={{ mr: isMobile ? "0px" : "16px" }}
                        label={"Внутреннее название вопроса"}
                        checked={question.content.innerNameCheck}
                        handleChange={({ target }) => {
                            updateQuestion(question.id, question => {
                                if (question.type !== "rating") return;

                                question.content.innerNameCheck = target.checked;
                                question.content.innerName = target.checked ? question.content.innerName : "";
                            });
                        }}
                    />
                    <Tooltip title="Будет отображаться как заголовок вопроса в приходящих заявках." placement="top">
                        <Box>
                            <InfoIcon />
                        </Box>
                    </Tooltip>
                </Box>
                {question.content.innerNameCheck && (
                    <CustomTextField
                        placeholder={"Развёрнутое описание вопроса"}
                        text={question.content.innerName}
                        onChange={({ target }) => setInnerName(target.value)}
                    />
                )}
            </Box>
        </Box>
    );
}
