import {
  Box,
  Button,
  Chip,
  FormControl,
  FormControlLabel,
  IconButton,
  Link,
  Modal,
  Radio,
  RadioGroup,
  Typography,
  useTheme,
} from "@mui/material";
import {
  questionStore,
  resetSomeField,
  updateQuestionsList,
} from "@root/questions";
import { Select } from "./Select";

import DeleteIcon from "@icons/questionsPage/deleteIcon";
import RadioCheck from "@ui_kit/RadioCheck";
import RadioIcon from "@ui_kit/RadioIcon";
import InfoIcon from "@icons/Info";

type BranchingQuestionsProps = {
  totalIndex: number;
};

const ACTIONS = ["Показать", "Скрыть"];
const STIPULATIONS = ["Условие 1", "Условие 2", "Условие 3"];
const ANSWERS = ["Ответ 1", "Ответ 2", "Ответ 3"];
const CONDITIONS = [
  "Все условия обязательны",
  "Обязательно хотя бы одно условие",
];

export default function BranchingQuestions({
  totalIndex,
}: BranchingQuestionsProps) {
  const { openedModalSettings, listQuestions } = questionStore();
  const theme = useTheme();

  const handleClose = () => {
    resetSomeField({ openedModalSettings: "" });
  };

  return (
    <>
      <Modal
        open={Boolean(openedModalSettings)}
        onClose={handleClose}
        aria-labelledby="modal-modal-title"
        aria-describedby="modal-modal-description"
      >
        <Box
          sx={{
            position: "absolute" as "absolute",
            overflow: "hidden",
            top: "50%",
            left: "50%",
            transform: "translate(-50%, -50%)",
            maxWidth: "620px",
            width: "100%",
            bgcolor: "background.paper",
            borderRadius: "12px",
            boxShadow: 24,
            p: 0,
          }}
        >
          <Box
            sx={{
              boxSizing: "border-box",
              background: "#F2F3F7",
              padding: "25px",
              height: "70px",
              display: "flex",
            }}
          >
            <Typography sx={{ color: "#9A9AAF" }}>()</Typography>
            <InfoIcon width={24} height={24} />
          </Box>
          <Box
            sx={{
              padding: "20px",
              display: "flex",
              flexDirection: "column",
              gap: "30px",
            }}
          >
            <Box
              sx={{
                display: "flex",
                gap: "20px",
                alignItems: "center",
              }}
            >
              <Select
                items={ACTIONS}
                activeItemIndex={
                  listQuestions[totalIndex].content.rule.show ? 0 : 1
                }
                sx={{ maxWidth: "140px" }}
                onChange={(action) => {
                  const clonContent = listQuestions[totalIndex].content;
                  clonContent.rule.show = action === ACTIONS[0];
                  updateQuestionsList(totalIndex, { content: clonContent });
                }}
              />
              <Typography sx={{ color: theme.palette.grey2.main }}>
                если в ответе на вопрос
              </Typography>
            </Box>
            {listQuestions[totalIndex].content.rule.reqs.map(
              (request, index) => (
                <Box
                  key={index}
                  sx={{
                    padding: "20px",
                    borderRadius: "8px",
                    height: "100%",
                    bgcolor: "#F2F3F7",
                  }}
                >
                  <Box
                    sx={{
                      display: "flex",
                      justifyContent: "space-between",
                      alignItems: "center",
                      pb: "5px",
                    }}
                  >
                    <Typography sx={{ color: "#4D4D4D", fontWeight: "500" }}>
                      Условие 1
                    </Typography>
                    <IconButton
                      sx={{ borderRadius: "6px", padding: "2px" }}
                      onClick={() => {
                        const clonContent = listQuestions[totalIndex].content;

                        clonContent.rule.reqs.splice(index, 1);
                        updateQuestionsList(totalIndex, {
                          content: clonContent,
                        });
                      }}
                    >
                      <DeleteIcon color={"#4D4D4D"} />
                    </IconButton>
                  </Box>
                  <Select
                    empty
                    activeItemIndex={request.id ? Number(request.id) : -1}
                    items={STIPULATIONS}
                    onChange={(stipulation) => {
                      const clonContent = listQuestions[totalIndex].content;

                      clonContent.rule.reqs[index] = {
                        id: String(
                          STIPULATIONS.findIndex((item) =>
                            item.includes(stipulation)
                          )
                        ),
                        vars: request.vars,
                      };

                      updateQuestionsList(totalIndex, { content: clonContent });
                    }}
                    sx={{ marginBottom: "15px" }}
                  />
                  {request.id && (
                    <>
                      <Box
                        sx={{
                          display: "flex",
                          alignItems: "center",
                          pb: "10px",
                        }}
                      >
                        <Typography
                          sx={{ color: "#4D4D4D", fontWeight: "500" }}
                        >
                          Дан ответ
                        </Typography>
                        <Typography sx={{ color: "#7E2AEA", pl: "10px" }}>
                          (Укажите один или несколько вариантов)
                        </Typography>
                      </Box>
                      <Select
                        empty
                        activeItemIndex={-1}
                        items={ANSWERS}
                        onChange={(answer) => {
                          const clonContent = listQuestions[totalIndex].content;
                          const answerItemIndex = ANSWERS.findIndex(
                            (answerItem) => answerItem === answer
                          );

                          if (
                            !clonContent.rule.reqs[index].vars.includes(
                              answerItemIndex
                            )
                          ) {
                            listQuestions[totalIndex].content.rule.reqs[
                              index
                            ].vars.push(answerItemIndex);
                          }

                          updateQuestionsList(totalIndex, {
                            content: clonContent,
                          });
                        }}
                        sx={{
                          marginBottom: "10px",
                          ".MuiSelect-select.MuiInputBase-input": {
                            color: "transparent",
                          },
                        }}
                      />
                      <Box
                        sx={{
                          display: "flex",
                          gap: "10px",
                        }}
                      >
                        {listQuestions[totalIndex].content.rule.reqs[
                          index
                        ].vars.map((item, varIndex) => (
                          <Chip
                            key={varIndex}
                            label={ANSWERS[item]}
                            variant="outlined"
                            onDelete={() => {
                              const clonContent =
                                listQuestions[totalIndex].content;
                              const removedItemIndex = clonContent.rule.reqs[
                                index
                              ].vars.findIndex((varItem) => varItem === item);

                              clonContent.rule.reqs[index].vars.splice(
                                removedItemIndex,
                                1
                              );

                              updateQuestionsList(totalIndex, {
                                content: clonContent,
                              });
                            }}
                          />
                        ))}
                      </Box>
                    </>
                  )}
                </Box>
              )
            )}
            <Box
              sx={{
                display: "flex",
                flexDirection: "column",
                alignItems: "baseline",
              }}
            >
              <Link
                variant="body2"
                sx={{
                  color: theme.palette.brightPurple.main,
                  marginBottom: "10px",
                }}
                onClick={() => {
                  const clonContent = listQuestions[totalIndex].content;
                  clonContent.rule.reqs.push({ id: "", vars: [] });
                  updateQuestionsList(totalIndex, { content: clonContent });
                }}
              >
                Добавить условие
              </Link>
              <FormControl>
                <RadioGroup
                  aria-labelledby="demo-controlled-radio-buttons-group"
                  defaultValue={
                    listQuestions[totalIndex].content.rule.or ? 0 : 1
                  }
                  onChange={({ target }) => {
                    const clonContent = listQuestions[totalIndex].content;
                    clonContent.rule.or = target.value === CONDITIONS[0];
                    updateQuestionsList(totalIndex, { content: clonContent });
                  }}
                >
                  {CONDITIONS.map((condition, index) => (
                    <FormControlLabel
                      key={index}
                      sx={{ color: theme.palette.grey2.main }}
                      value={index}
                      control={
                        <Radio
                          checkedIcon={<RadioCheck />}
                          icon={<RadioIcon />}
                        />
                      }
                      label={condition}
                    />
                  ))}
                </RadioGroup>
              </FormControl>
            </Box>
            <Box sx={{ display: "flex", justifyContent: "end", gap: "10px" }}>
              <Button
                variant="outlined"
                onClick={handleClose}
                sx={{ width: "100%", maxWidth: "130px" }}
              >
                Отмена
              </Button>
              <Button
                variant="contained"
                sx={{ width: "100%", maxWidth: "130px" }}
                onClick={handleClose}
              >
                Готово
              </Button>
            </Box>
          </Box>
        </Box>
      </Modal>
    </>
  );
}
