using System;
using System.Collections.Generic;
using System.Text;

namespace VirksomhedsSpil
{
    class Model
    {
        Leverandoer l;
        Raavare r;
        Regnskab regnsk;
        Lager lager;
        Produktion p;

        public Model()
        {
            l = new Leverandoer();
            r = new Raavare();
            lager = new Lager();
            regnsk = new Regnskab();
            p = new Produktion();
        }

        public Leverandoer getLeverandoer()
        { return l; }

        public Raavare getRaavare()
        { return r; }

        public Regnskab getRegnskab()
        { return regnsk; }

        public Lager getLager()
        { return lager; }

        public Produktion getProduktion()
        { return p; }

    }

    class Facade
    {
        Model m;
        public Facade(Model model)
        {
            m = model;
        }

        public void forfra()
        { // Sæt alle objekter til start situation
            Leverandoer l = m.getLeverandoer();
            l.Master = 2;
            Raavare r = m.getRaavare();
            r.Value = 3;
            Lager lager = m.getLager();
            lager.Master = 4;
            lager.Value = 8;

            Regnskab regnsk = m.getRegnskab();
            regnsk.Kasse = 17;
            regnsk.Raavarer = 3;
        }

        public void modtageBestilteVarer()
        {
            Leverandoer l = m.getLeverandoer();
            int antal = l.Master;
            Raavare r = m.getRaavare();
            Regnskab regnskab = m.getRegnskab();
            r.modtagMaster(regnskab, antal);
            l.reset();
        }

        public void markerNyeOrdrer(int antal)
        {
            Leverandoer l = m.getLeverandoer();
            l.Master = antal;
        }

        public void opdaterProduktion()
        {
            Produktion p = m.getProduktion();
            Lager l = m.getLager();
            int master = 0;
            Fabrik f;
            f = p.getFabrik(0);
            f.opdater();
            master = master + f.faerdig("Master");
            f = p.getFabrik(1);
            f.opdater();
            master = master + f.faerdig("Master");
            f = p.getFabrik(2);
            f.opdater();
            master = master + f.faerdig("Master");
            l.Master = l.Master + master;
        }

    }

    class Leverandoer
    {
        private int markeretBestillingMaster;

        public Leverandoer()
        {
            Master = 0;
        }

        public int Master
        {
            get { return markeretBestillingMaster; }
            set { markeretBestillingMaster = value; }
        }

        public void reset()
        {
            Master = 0;
        }

    }

    class Raavare
    {
        private int antalMaster;
        private int valueMaster;

        public Raavare()
        {
            antalMaster = 0;
            valueMaster = 0;
        }

        public void modtagMaster(Regnskab regnsk, int antal)
        {
            Master = antal;
            Value = Value + antal * 1;
            regnsk.Kasse = regnsk.Kasse - antal * 1;
            regnsk.Raavarer = regnsk.Raavarer + antal * 1;
        }

        public int Master
        {
            get { return antalMaster; }
            set { antalMaster = value; }
        }

        public int Value
        {
            get { return valueMaster; }
            set { valueMaster = value; }
        }
    }

    class Lager
    {
        private int antalMaster;
        private int valueMaster;

        public Lager()
        {
            antalMaster = 0;
            valueMaster = 0;
        }

        public void modtagMaster()
        {
            Master++;
            Value = Value + 2;
        }

        public int Master
        {
            get { return antalMaster; }
            set { antalMaster = value; }
        }

        public int Value
        {
            get { return valueMaster; }
            set { valueMaster = value; }
        }
    }

    class Regnskab
    {
        private int kasse;
        private int raavarer;

        public Regnskab()
        {
            kasse = 0;
            raavarer = 0;
        }

        public int Kasse
        {
            get { return kasse; }
            set { kasse = value; }
        }

        public int Raavarer
        {
            get { return raavarer; }
            set { raavarer = value; }
        }

    }

    class Vaerksted
    {
        private string type;
        private string produkt;
        private int step;

        public Vaerksted()
        {
            type = "";
            produkt = "";
            step = 0;
        }

        public Vaerksted(string enType, string etProdukt)
        {
            type = enType;
            produkt = etProdukt;
            step = 0;
        }

        public string Type
        {
            get { return type; }
            set { type = value; }
        }

        public string Produkt
        {
            get { return produkt; }
            set { produkt = value; }
        }

        public int Step
        {
            get { return step; }
            set { step = value; }
        }

        public void opdater()
        {
            if (step > 0)
                step++;
        }

        public int faerdig(string etProdukt)
        {
            int antal = 0;
            if (Produkt == etProdukt)
                if (Type == "Funktionsværksted")
                    if (Step == 4)
                    {
                        antal = 1;
                        Step = 0;
                    }
            if (Produkt == etProdukt)
                if (Type == "Produktværksted")
                    if (Step == 3)
                    {
                        antal = 1;
                        Step = 0;
                    }
            return antal;
        }

    }

    class Fabrik
    {
        private string navn;
        private int vaerdi;
        private Vaerksted[] v;

        public Fabrik(string etNavn, int antal, int enVaerdi)
        {
            navn = etNavn;
            vaerdi = enVaerdi;
            v = new Vaerksted[antal];
        }

        public void buyVaerksted(int i, Vaerksted vs)
        {
            v[i] = vs;
        }

        public void opdater()
        {
            for (int i = 0; i < v.Length; i++)
            {
                v[i].opdater();
            }
        }

        public int faerdig(string etProdukt)
        {
            int antal = 0;
            for (int i = 0; i < v.Length; i++)
            {
                antal = antal + v[i].faerdig(etProdukt);
            }
            return antal;
        }

        public int Vaerdi
        {
            get { return vaerdi; }
            set { vaerdi = value; }
        }

        public int getAntal()
        {   
            return v.Length; 
        }

        public Vaerksted getVaerksted(int position)
        {
            return v[position];
        }

    }

    class Produktion
    {
        private Fabrik[] f = new Fabrik[3];

        public Produktion()
        {
            Fabrik fabrik;
            fabrik = new Fabrik("Den Gamle Fabrik", 4, 20);
            Vaerksted vs;
            vs = new Vaerksted("Funktionsværksted", "Master");
            vs.Step = 1;
            fabrik.buyVaerksted(0, vs);
            vs = new Vaerksted("Funktionsværksted", "Master");
            vs.Step = 2;
            fabrik.buyVaerksted(1, vs);
            vs = new Vaerksted("Funktionsværksted", "Master");
            vs.Step = 3;
            fabrik.buyVaerksted(2, vs);
            vs = new Vaerksted("Produktværksted", "Master");
            vs.Step = 1;
            fabrik.buyVaerksted(3, vs);
            f[0] = fabrik;
            fabrik = new Fabrik("Den Lille Fabrik", 0, 0);
            f[1] = fabrik;
            fabrik = new Fabrik("Den Nye Fabrik", 0, 0);
            f[2] = fabrik;
        }

        public Fabrik getFabrik(int index)
        {
            return f[index];
        }

        public void opdater()
        {
            for (int i = 0; i < 3; i++)
            {
                if (f[i].getAntal() > 0) f[i].opdater();
            }
        }

        public int faerdig(string etProdukt)
        {
            int antal = 0;
            for (int i = 0; i < 3; i++)
            {
                if (f[i].getAntal() > 0) antal = antal + f[i].faerdig(etProdukt);
            }
            return antal;
        }

    }

}
