/*
Veidoja: Lana Lobza
Grupa: 110
Praktiskais darbs 7
Izmantotais Compiler: www.onlinegdb.com
*/
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 1.uzd.
Console.WriteLine("Budžeta analīze");
List<double> izdevumi = IevadietIzdevumus();

Console.Write("Ievadiet minimālo izdevumu slieksni: ");
double slieksnis = double.Parse(Console.ReadLine());

List<double> filtretie = FiltretIzdevumus(izdevumi, slieksnis);
double diapazons = AprekinatMainibu(filtretie);

/* string.Join - pārvērš sarakstu (List<double>) par vienu teksta rindu,
kur visi elementi ir savienoti ar norādīto atdalītāju */
Console.WriteLine("\nFiltrētie izdevumi: " + string.Join(", ", filtretie));
Console.WriteLine("Diapazons: " + diapazons);

// 2.uzd.
Console.WriteLine("\nNoliktavas meklētājs");

// Noliktavas izveide (4 ejas, 5 plaukti)
string[,] noliktava = {
{ "A1", "A2", "", "A4", "A5" },
{ "B1", "B2", "B3", "", "B5" },
{ "", "", "C3", "C4", "C5" },
{ "D1", "", "D3", "D4", "D5" }
};

Console.Write("Ievadiet meklējamo preces kodu: ");
string kods = Console.ReadLine();

string atrasts = AtklatPreci(noliktava, kods);
Console.WriteLine(atrasts);

int tuksie = AprekinatNeaizpilditas(noliktava);
Console.WriteLine("Tukšo plauktu skaits: " + tuksie);

// 3.uzd.
Console.WriteLine("\nAttāluma kalkulators");

Console.Write("Ievadiet x1: ");
double x1 = double.Parse(Console.ReadLine());
Console.Write("Ievadiet y1: ");
double y1 = double.Parse(Console.ReadLine());
Console.Write("Ievadiet x2: ");
double x2 = double.Parse(Console.ReadLine());
Console.Write("Ievadiet y2: ");
double y2 = double.Parse(Console.ReadLine());

double attalums = AprekinatPlaknesAttalumu(x1, y1, x2, y2);
Console.WriteLine("Attālums starp punktiem: " + attalums);

Console.Write("Ievadiet leņķi grādos: ");
double gradi = double.Parse(Console.ReadLine());

double radiani = KonvertetRadianos(gradi);
Console.WriteLine("Radiānos: " + radiani);
}

// 1.uzd. Budžets

static List<double> IevadietIzdevumus()
{
List<double> izdevumi = new List<double>();
Console.WriteLine("Ievadiet izdevumus (tukša rinda vai 'gals' – beigt):");

while (true)
{
Console.Write("> ");
string ievade = Console.ReadLine().Trim();
// .Trim() noņem tukšās simbolus (whitespace) no sākuma un beigām ievadītajam tekstam.

if (ievade == "" || ievade.ToLower() == "gals")
break;

if (double.TryParse(ievade, out double summa))
izdevumi.Add(summa);
else
Console.WriteLine("Nederīgs skaitlis!");
}

return izdevumi;
}

static List<double> FiltretIzdevumus(List<double> izejasDati, double slieksnis)
{
List<double> rezultats = new List<double>();

foreach (double izdevums in izejasDati)
{
if (izdevums < slieksnis)
continue;

rezultats.Add(izdevums);
}

return rezultats;
}

static double AprekinatMainibu(List<double> dati)
{
if (dati.Count == 0)
return 0;

double min = double.MaxValue;
double max = double.MinValue;

foreach (double x in dati)
{
if (x < min) min = x;
if (x > max) max = x;
}

return Math.Abs(max - min);
}

// 2.uzd. Noliktavas meklēšana
static string AtklatPreci(string[,] masivs, string kods)
{
bool atrasts = false;
int eja = -1, plaukts = -1;

for (int i = 0; i < masivs.GetLength(0); i++)
{
for (int j = 0; j < masivs.GetLength(1); j++)
{
if (masivs[i, j] == kods)
{
atrasts = true;
eja = i;
plaukts = j;
break; 
}
}

if (atrasts)
break;
}

if (atrasts)
return $"Prece atrasta: Eja {eja}, Plaukts {plaukts}";
else
return "Prece netika atrasta!";
}

static int AprekinatNeaizpilditas(string[,] masivs)
{
int skaits = 0;

for (int i = 0; i < masivs.GetLength(0); i++)
{
for (int j = 0; j < masivs.GetLength(1); j++)
{
if (masivs[i, j] == "" || masivs[i, j] == null)
skaits++;
}
}

return skaits;
}

// 3.uzd. Attāluma kalkulators

static double AprekinatPlaknesAttalumu(double x1, double y1, double x2, double y2)
{
double dx = x2 - x1;
double dy = y2 - y1;

return Math.Sqrt(Math.Pow(dx, 2) + Math.Pow(dy, 2));
}

static double KonvertetRadianos(double gradi)
{
return gradi * (Math.PI / 180.0);
}

}