using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Shlukova_Analyza_BP
{
    public class Scenar
    {
        public List<List<int>> platneRadky = new List<List<int>>(); // list platnych radku pro evo, mbu,...
        public double poplatek, rok, cena, zahranici, skl_parametr, celk_naklady; // parametry scenare
        public double[,] evo, mbu, skl, zlf, prekl; // nactena data
        public Scenar(List<string> nactenyScenar, List<double> parametry) // konstruktor
        {
            poplatek = parametry[0];
            rok = parametry[1];
            cena = parametry[2];
            int delka = nactenyScenar.Count;
            int[,] rozmezi = Rozmezi(nactenyScenar, delka);
            nastavParametry(nactenyScenar[0]);
            vytvorEvo(nactenyScenar, rozmezi[0, 0], rozmezi[0, 1]);
            vytvorMbu(nactenyScenar, rozmezi[1, 0], rozmezi[1, 1]);
            vytvorSkl(nactenyScenar, rozmezi[2, 0], rozmezi[2, 1]);
            vytvorZlf(nactenyScenar, rozmezi[3, 0], rozmezi[3, 1]);
            vytvorPrekl(nactenyScenar, rozmezi[4, 0], rozmezi[4, 1]);
        }
        private int[,] Rozmezi(List<string> nactenyScenar, int delka) // Najde rozmezi, kde se nachazi data pro evo, mbu,...
        {
            int[,] rozmezi = new int[5, 2];
            // zacatek evo
            rozmezi[0, 0]= najdiMeze(nactenyScenar, 0, "<evo>", delka);
            // konec evo
            rozmezi[0, 1] = najdiMeze(nactenyScenar, rozmezi[0, 0] + 1, "</evo>", delka);
            // zacatek mbu
            rozmezi[1, 0] = najdiMeze(nactenyScenar, rozmezi[0, 1] + 1, "<mbu>", delka);
            // konec mbu
            rozmezi[1, 1] = najdiMeze(nactenyScenar, rozmezi[1, 0] + 1, "</mbu>", delka);
            // zacatek skl
            rozmezi[2, 0] = najdiMeze(nactenyScenar, rozmezi[1, 1] + 1, "<skl>", delka);
            // konec skl
            rozmezi[2, 1] = najdiMeze(nactenyScenar, rozmezi[2, 0] + 1, "</skl>", delka);
            // zacatek zlf
            rozmezi[3, 0] = najdiMeze(nactenyScenar, rozmezi[2, 1] + 1, "<zlf>", delka);
            // konec zlf
            rozmezi[3, 1] = najdiMeze(nactenyScenar, rozmezi[3, 0] + 1, "</zlf>", delka);
            // zacatek prekl
            rozmezi[4, 0] = najdiMeze(nactenyScenar, rozmezi[3, 1] + 1, "<prekl>", delka);
            // konec prekl
            rozmezi[4, 1] = najdiMeze(nactenyScenar, rozmezi[4, 0] + 1, "</prekl>", delka);
            return rozmezi;
        }
        private int najdiMeze(List<string> nactenyScenar, int zacatek, string hledane, int delka) // hleda retezec pro Rozmezi
        {
            for (int i = zacatek; i < delka; i++)
            {
                if (nactenyScenar[i] == hledane)
                {
                    return i;
                }
            }
            return 0; // nemělo by se stát
        }
        private void vytvorEvo(List<string> nactenyScenar, int horni, int dolni)
        {
            evo = new double[dolni - horni - 1, 3];
            for (int i = horni + 1; i < dolni; i++)
            {
                List<double> cisla = zpracujRadek(nactenyScenar[i]);
                for (int j = 0; j < 3; j++)
                {
                    evo[i - horni - 1, j] = cisla[j];
                }
            }
        }
        private void vytvorMbu(List<string> nactenyScenar, int horni, int dolni)
        {
            mbu = new double[dolni - horni - 1, 3];
            for (int i = horni + 1; i < dolni; i++)
            {
                List<double> cisla = zpracujRadek(nactenyScenar[i]);
                for (int j = 0; j < 3; j++)
                {
                    mbu[i - horni - 1, j] = cisla[j];
                }
            }
        }
        private void vytvorSkl(List<string> nactenyScenar, int horni, int dolni)
        {
            skl = new double[dolni - horni - 1, 3];
            for (int i = horni + 1; i < dolni; i++)
            {
                List<double> cisla = zpracujRadek(nactenyScenar[i]);
                for (int j = 0; j < 3; j++)
                {
                    skl[i - horni - 1, j] = cisla[j];
                }
            }
        }
        private void vytvorZlf(List<string> nactenyScenar, int horni, int dolni)
        {
            zlf = new double[dolni - horni - 1, 3];
            for (int i = horni + 1; i < dolni; i++)
            {
                List<double> cisla = zpracujRadek(nactenyScenar[i]);
                for (int j = 0; j < 3; j++)
                {
                    zlf[i - horni - 1, j] = cisla[j];
                }
            }
        }
        private void vytvorPrekl(List<string> nactenyScenar, int horni, int dolni)
        {
            prekl = new double[dolni - horni - 1, 3];
            for (int i = horni + 1; i < dolni; i++)
            {
                List<double> cisla = zpracujRadek(nactenyScenar[i]);
                for (int j = 0; j < 3; j++)
                {
                    prekl[i - horni - 1, j] = cisla[j];
                }
            }
        }
        private List<double> zpracujRadek(string radek) // z radku cisel oddelenych mezerami udela seznam cisel
        {
            List<double> cisla = new List<double>();
            int delka = radek.Length;
            for (int i = 0; i < delka; i++)
            {
                if (char.IsDigit(radek[i]) || radek[i] == '-')
                {
                    string s = "";
                    while (radek[i] != ' ' && !(char.IsLetter(radek[i])) && radek[i] != '>')
                    {
                        s += radek[i];
                        i++;
                        if (i == delka)
                        {
                            break;
                        }
                    }
                    cisla.Add(Convert.ToDouble(s, System.Globalization.CultureInfo.InvariantCulture));
                }
            }
            return cisla;
        }
        private void nastavParametry(string parametry) // nastavi parametry scenare
        {
            List<double> cisla = zpracujRadek(parametry);
            zahranici = cisla[0];
            skl_parametr = cisla[1];
            celk_naklady = cisla[2];
        }
    }
}
