import { Line } from "react-chartjs-2";
import {
  Chart as ChartJS,
  CategoryScale,
  LinearScale,
  BarElement,
  Title,
  Tooltip as ChartTooltip,
  Legend, PointElement, LineElement, BarController,
} from 'chart.js';
import { useShap } from "../api/filters.js";
import { useMemo } from "react";
import { useDzkhFilters } from "../../stores/useDzkhFilters.js";

ChartJS.register(
  CategoryScale,
  BarController,
  PointElement,
  LineElement,
  LinearScale,
  BarElement,
  Title,
  ChartTooltip,
  Legend
);

const GRAPH_LABELS_MAP= {
  t_shap: "Температура воздуха",
  fi_remont1_shap: "Замена стояков ХВС",
  fi_remont2_shap: "Ремонт разводящих внутридомовых магистралей ХВС",
  fi_remont3_shap: "Замена стояков ГВС",
  fi_remont4_shap: "Ремонт разводящих внутридомовых магистралей ГВС",
  fi_remont5_shap: "Ремонт стояков канализации",
  fi_remont6_shap: "Ремонт выпусков и сборных трубопроводов системы канализации",
  fi_remont7_shap: "Ремонт внутридомовых систем теплоснабжения (с заменой стояков)",
  fi_remont8_shap: "Ремонт разводящих магистралей системы теплоснабжения",
  total_area_shap: "Общая площадь",
  fi_is_block_shap: "Материал - блочный",
  fi_is_brick_shap: "Материал - кирпичный",
  fi_is_panel_shap: "Материал - панельный",
  building_wear_shap: "Износ",
  fi_is_monolit_shap: "Материал - монолитный",
  fi_energy_class_shap: "Класс энергоэффективности",
  fi_building_year_shap: "Год постройки",
  gvs_avg_heat_load_shap: "Средняя тепловая нагрузка ГВС",
  heating_heat_load_shap: "Тепловая нагрузка на отопление",
  gvs_fact_heat_load_shap: "Фактическая тепловая нагрузка ГВС",
  ventilation_heat_load_shap: "Тепловая нагрузка на вентиляцию"
};
export const PointChart = ({ point }) => {
  const { data: shapData } = useShap(point.id);
  const {consumer_filter} = useDzkhFilters();

  const shap = useMemo(() => {
    if (!shapData) return null;
    if (!consumer_filter || !consumer_filter.key.includes("prob")) return shapData['prob1_35'];
    return shapData[`${consumer_filter.key}_35`];
  }, [shapData, consumer_filter]);

  if (!shapData || !shap) return "";

  const options = {
    indexAxis: 'y',
    elements: {
      bar: {
        borderWidth: 0,
        borderRadius: 5,
        pointStyle: 'circle'
      },
    },
    plugins: {
      legend: {
        display: false
      },
      tooltip: {
        displayColors: false,
        yAlign: "top",
      },
    },
    scales: {
      y: {
        stacked: true,
      },
      x: {
        title: {
          display: true,
          text: 'Вклад в прогноз, %',
        },
        grid: {
          color: function(context) {
            if (context.tick.value === 0) {
              return "#000000";
            }

            return "#E5E5E5";
          },
        },
      }
    }
  };

  const labels = Object.keys(GRAPH_LABELS_MAP).sort((a, b) => {
    if (Math.abs(shap[a]) < Math.abs(shap[b])) return 1;
    else return -1;
  }).slice(0, 15);

  const data = {
    labels: labels.map((l) => GRAPH_LABELS_MAP[l]),
    datasets: [
      {
        data: labels.map((l) => shap ? shap[l] : 0),
        backgroundColor: labels.map((l) => shap[l]).map(v => v <= 0 ? '#278211' : '#CC2500'),
        hoverBackgroundColor: labels.map((l) => shap[l]).map(v => v <= 0 ? '#2DB20C' : '#F22C00'),
        type: 'bar',
        showLine: false,
      },
    ],
  };
  return <Line options={options} data={data} />
}
