/**
 * Use this file for JavaScript code that you want to run in the front-end
 * on posts/pages that contain this block.
 *
 * When this file is defined as the value of the `viewScript` property
 * in `block.json` it will be enqueued on the front end of the site.
 *
 * Example:
 *
 * ```js
 * {
 *   "viewScript": "file:./view.js"
 * }
 * ```
 *
 * If you're not making any changes to this file because your project doesn't need any
 * JavaScript running in the front-end, then you should delete this file and remove
 * the `viewScript` property from `block.json`.
 *
 * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-metadata/#view-script
 */

/* eslint-disable no-console */
console.log( 'Hello World! (from lcp-visualizer)' );
/* eslint-enable no-console */


 // JavaScript to initialize D3.js for all elements with the class .lcp-visualizer
 document.addEventListener('DOMContentLoaded', function() {
    const data = [
        { date: '2023-01-01', team: 'Manchester City', goals: 2 },
        { date: '2023-01-01', team: 'Liverpool', goals: 1 },
        { date: '2023-02-01', team: 'Manchester City', goals: 3 },
        { date: '2023-02-01', team: 'Liverpool', goals: 2 },
        { date: '2023-03-01', team: 'Manchester City', goals: 4 },
        { date: '2023-03-01', team: 'Liverpool', goals: 3 },
        { date: '2023-04-01', team: 'Manchester City', goals: 3 },
        { date: '2023-04-01', team: 'Liverpool', goals: 4 },
        { date: '2023-05-01', team: 'Manchester City', goals: 5 },
        { date: '2023-05-01', team: 'Liverpool', goals: 4 }
    ];
    
    const parseDate = d3.timeParse("%Y-%m-%d");
    
    data.forEach(d => {
        d.date = parseDate(d.date);
        d.goals = +d.goals;
    });
    
    const teams = Array.from(new Set(data.map(d => d.team)));
    const color = d3.scaleOrdinal()
        .domain(teams)
        .range(d3.schemeCategory10);
    
    const margin = { top: 20, right: 30, bottom: 40, left: 40 };
    const width = 800 - margin.left - margin.right;
    const height = 400 - margin.top - margin.bottom;
    
    const svg = d3.select(".lcp-visualizer")
        .attr("width", width + margin.left + margin.right)
        .attr("height", height + margin.top + margin.bottom)
      .append("g")
        .attr("transform", `translate(${margin.left},${margin.top})`);
    
    const x = d3.scaleTime()
        .domain(d3.extent(data, d => d.date))
        .range([0, width]);
    
    const y = d3.scaleLinear()
        .domain([0, d3.max(data, d => d.goals)])
        .nice()
        .range([height, 0]);
    
    const line = d3.line()
        .x(d => x(d.date))
        .y(d => y(d.goals));
    
    svg.append("g")
        .attr("transform", `translate(0,${height})`)
        .call(d3.axisBottom(x));
    
    svg.append("g")
        .call(d3.axisLeft(y));
    
    const teamData = teams.map(team => {
        return {
            team: team,
            values: data.filter(d => d.team === team)
        };
    });
    
    const path = svg.selectAll(".line")
        .data(teamData)
        .enter().append("path")
          .attr("class", "line")
          .attr("d", d => line(d.values))
          .attr("stroke", d => color(d.team));
    
    // Hover effect
    teamData.forEach(team => {
        svg.selectAll(`circle.${team.team}`)
            .data(team.values)
            .enter().append("circle")
            .attr("class", team.team)
            .attr("cx", d => x(d.date))
            .attr("cy", d => y(d.goals))
            .attr("r", 4)
            .attr("fill", color(team.team))
            .on("mouseover", function(event, d) {
                d3.select(this)
                    .transition()
                    .duration(200)
                    .attr("r", 6)
                    .attr("fill", "orange");
                d3.select(`path.${d.team}`).classed("hover-line", true);
            })
            .on("mouseout", function(event, d) {
                d3.select(this)
                    .transition()
                    .duration(200)
                    .attr("r", 4)
                    .attr("fill", color(d.team));
                d3.select(`path.${d.team}`).classed("hover-line", false);
            });
    });
    
});