/*
Trieda zodpovedná, za výpočet svetelného toku svietidla, poprípade svetelného zdroja.
Uplatňuje sa tu metóda pásmových tokov, ktorá je bližšie popísaná v textovej časti
tejto práce.
Výsledok svetelného toku, sa prenáša do triedy TableWindow, kde sa ukladá, spolu s
ostatnými parametrami svetelného zdroja, a s hodnotami svietivosti tohto svetelného
zdroja, do implementovaných formátov (.csv, .ldt) ...
 */

package CalculationAndLampsSets;

import Windows.Window;
import java.util.ArrayList;
import java.util.List;

public class fluxCalculation {

        public List<Double> angles;
        public List<Double> spherePart;
        private Window window;
        private ArrayList<ArrayList<String>> values;


        /*
        Konštruktor triedy "fluxCalculation" ... ako parametre berie inštanciu
        triedy "Window", a list hodnôt, z ktorých následne počíta hodnotu
        svetelného toku ...
         */
        public fluxCalculation(Window window, ArrayList<ArrayList<String>> values){
            this.window = window;
            this.values = (ArrayList<ArrayList<String>>) values.clone();
            createAnglesRange();
            devideSphere();
        }

        /*
        Funkcia tvoriaca list hodnôt priestorových uhlov, potrebných, pre
        výpočet toku svietidla.
         */
        private void createAnglesRange() {
            angles = new ArrayList<>();
            double constant = 4 * Math.PI * Math.sin(Math.toRadians(Integer.parseInt(window.getID7_Dg())));

            for (int i = 0; i < values.get(0).size(); i++) {
                if(i % 2 != 0){
                    angles.add(constant * Math.sin(Math.toRadians(i * Integer.parseInt(window.getID7_Dg()))));
                }
            }
        }

        /*
        Funkcia tvoriaca list hodnôt velkostí jednotlivých C rovín ...
         */
        private void devideSphere() {
            spherePart = new ArrayList<>();

            int size = values.size();
            if (size > 1) {
                double distance = (360d / size);
                    for (int i = 0; i < size; i++) {
                        spherePart.add(distance);
                    }

            }else {
                spherePart.add(360d);
            }
        }

        /*
        Funkcia schopná určiť svetelný tok svietidla/zdroja svetla
        v závislosti od svietivosti zdroja, listu priestorových
        uhlov, a listu veľkostí jednotlivých C rovív ...
        -implementuje sa tu metóda výpočtu svetelného toku,
        prostredníctvom "metódy pásmových tokov, nesúmerného
        svietidla" ....
         */
        public double calculate() {
            double flux = 0;

            double partValue = 0;
            ArrayList<Double> partFlux = new ArrayList<>();

            for (ArrayList<String> list : values) {
                int i = 0;
                int j = 0;
                for (String value : list) {
                    if (i % 2 != 0){
                        partValue += Double.parseDouble(value) * angles.get(j);
                        j++;
                    }
                    i++;
                }
                partFlux.add(partValue);
                partValue = 0;
            }

            System.out.println(spherePart);
            System.out.println(angles);
            System.out.println(partFlux);

            int k = 0;
            for (Double fluxSphere : partFlux) {
                flux += fluxSphere * (spherePart.get(k)/360d);
                k++;
            }
            return  flux;
        }
}
