"use client";

import { useEffect, useState } from "react";
import { getData } from "@/app/api/api-utils";
import { endpoints } from "@/app/api/config";
import { ReleaseCard } from "../ReleaseCard/ReleaseCard";
import { useUserStore } from "@/app/store/user-store";

export const ReleaseInfo = (props) => {
  const userStore = useUserStore();
  const [releaseInfo, setReleaseInfo] = useState();
  const [list, setList] = useState();
  const [isFavorite, setIsFavorite] = useState(false);
  const [timer, seTimer] = useState();

  useEffect(() => {
    async function _fetchInfo() {
      let url = `${endpoints.release}/${props.id}`;

      if (userStore.token) {
        url = `${endpoints.release}/${props.id}?token=${userStore.token}`;
      }

      const release = await getData(url);
      setReleaseInfo(release);
      if (userStore.token) {
        setList(release.release.profile_list_status || 0);
        setIsFavorite(release.release.is_favorite);
      }
    }

    // I really think it's not the way it is should be done
    // but it works
    // FIX: double requests, 1st without token, and second with it.
    // now it's only 1 request with or w/o token, if page is reloaded.
    if (userStore.token) {
      clearTimeout(timer);
    }
    if (props.id) {
      seTimer(
        setTimeout(() => {
          _fetchInfo();
        }, 1000),
      );
    }
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [userStore.token]);

  useEffect(() => {
    async function _setList() {
      const url = `${endpoints.user.bookmarks.list}/${list}/${props.id}/add?token=${userStore.token}`;
      await getData(url);
    }
    if (
      userStore.token &&
      releaseInfo &&
      list != releaseInfo.release.profile_list_status
    ) {
      _setList();
      releaseInfo.release.profile_list_status = list;
    }
  }, [userStore.token, list]);

  function _setFav() {
    async function __updateFavorite() {
      const add_url = `${endpoints.user.favorites}/list/${props.id}/add?token=${userStore.token}`;
      const delete_url = `${endpoints.user.favorites}/list/${props.id}/delete?token=${userStore.token}`;
      await getData(!isFavorite ? add_url : delete_url);
    }
    __updateFavorite();
  }

  const lists = [
    { list: 0, name: "Не смотрю" },
    { list: 1, name: "Смотрю" },
    { list: 2, name: "В планах" },
    { list: 3, name: "Просмотрено" },
    { list: 4, name: "Отложено" },
    { list: 5, name: "Брошено" },
  ];

  return (
    <>
      {releaseInfo ? (
        <>
          <article className="no-padding fill">
            <div className="grid no-space">
              <div className="s3">
                <img className="responsive" src={releaseInfo.release.image} />
              </div>
              <div className="s9">
                <div className="padding">
                  <div className="grid">
                    <div className="s9">
                      <h5>{releaseInfo.release.title_ru}</h5>
                      <h6 className="small no-margin">
                        {releaseInfo.release.title_original}
                      </h6>
                    </div>
                    <div className="s3 row right-align">
                      {userStore.token && list >= 0 && (
                        <button className="responsive">
                          <span>{lists[list].name}</span>
                          <i>arrow_drop_down</i>
                          <menu>
                            {lists.map((item) => {
                              return (
                                <a
                                  key={item.list}
                                  onClick={() => {
                                    setList(item.list);
                                  }}
                                >
                                  {item.name}
                                </a>
                              );
                            })}
                          </menu>
                        </button>
                      )}
                      {userStore.token && releaseInfo && (
                        <button
                          className="circle"
                          onClick={() => {
                            setIsFavorite(!isFavorite);
                            _setFav();
                          }}
                        >
                          <i className={isFavorite ? "fill" : ""}>favorite</i>
                        </button>
                      )}
                    </div>
                  </div>
                  <p className="small no-margin">
                    {releaseInfo.release.country} •{" "}
                    {releaseInfo.release.status.name} •{" "}
                    {releaseInfo.release.episodes_released}/
                    {releaseInfo.release.episodes_total
                      ? releaseInfo.release.episodes_total
                      : "?"}
                  </p>
                  <p>{releaseInfo.release.description}</p>
                </div>
              </div>
            </div>
          </article>
          {releaseInfo.release.related_releases.length > 0 && (
            <article className="grid">
              <div className="row s12">
                <i>hub</i>
                <h5>Связанные релизы</h5>
              </div>
              <nav className="s12 scroll">
                {releaseInfo.release.related_releases.map((item) => {
                  if (item.id == props.id) {
                    return "";
                  }
                  return (
                    <ReleaseCard
                      className={"s1"}
                      key={item.id}
                      id={item.id}
                      title={item.title_ru}
                      poster={item.image}
                      description={""}
                      height={400}
                    />
                  );
                })}
              </nav>
            </article>
          )}
        </>
      ) : (
        <div className="center-align">
          <progress className="circle" />
        </div>
      )}
    </>
  );
};