import * as THREE from 'three';
import * as Types from '../../../types/world/worldTypes';
import * as CONSTANTS from '../../../types/world/worldConstants';
import { Base } from '@react-three/csg';
import { MeshDiscardMaterial } from '@react-three/drei';
import { useUpdateScene, useWalls } from '../../../store/store';
import { useEffect } from 'react';
import { getLines } from '../../../services/factoryBuilder/lines/getLinesApi';
import objectLinesToArray from '../geomentries/lines/lineConvertions/objectLinesToArray';
import loadWalls from '../geomentries/walls/loadWalls';

const WallsMesh = ({ lines }: any) => {
    const { walls, setWalls } = useWalls();
    const { updateScene, setUpdateScene } = useUpdateScene();

    useEffect(() => {
        if (updateScene) {

            const email = localStorage.getItem('email')
            const organization = (email!.split("@")[1]).split(".")[0];

            getLines(organization).then((data) => {
                const Lines: Types.Lines = objectLinesToArray(data);
                localStorage.setItem("Lines", JSON.stringify(Lines));

                if (Lines) {
                    loadWalls(lines, setWalls);
                }
            })
            setUpdateScene(false);
        }
    }, [updateScene])

    return (
        <>
            {walls.map((wall: Types.Wall, index: number) => (
                <mesh key={index}>
                    <Base
                        name={`Wall${index + 1}`}
                        geometry={wall[0]}
                        rotation={wall[1]}
                        position={wall[2]}
                        userData={{ WallType: wall[3], Layer: wall[4] }}
                    >
                        <meshStandardMaterial
                            side={THREE.DoubleSide}
                            color={CONSTANTS.wallConfig.defaultColor}
                        />
                    </Base>
                    <mesh
                        castShadow
                        geometry={wall[0]}
                        rotation={wall[1]}
                        position={wall[2]}
                        name={`WallRaycastReference_${index + 1}`}
                    >
                        <MeshDiscardMaterial />
                    </mesh>
                </mesh>
            ))}
        </>
    )
}

export default WallsMesh;