using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Imaging;
using System.Threading;

namespace Zelva
{
    public partial class Form1 : Form
    {
        Zelva zelva;
        Graphics grafikaPole;
        
        
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            zelva = new Zelva(350, 350); // Želva zaujme pozici ve středu ohrádky
            // Vyrobí grafiku ohrady, aby se nemusela zbytečně vyvolávat pořád dokola
            grafikaPole = pole.CreateGraphics(); 
        }

        private void tlNahratProgram_Click(object sender, EventArgs e)
        {
            if (otevirani.ShowDialog() == DialogResult.OK)
            {
                // uživatel dialog nezamítl
                // nahrajeme program

                // čtečka souborů nahraje zvolený soubor
                StreamReader r = new StreamReader(otevirani.FileName);

                // uložení programu do želvy
                zelva.program = r.ReadToEnd();
                zelva.shrinkProgram();

                r.Close();
            }
        }

        private void tlUlozitVystup_Click(object sender, EventArgs e)
        {
            // Vytvoříme novou bitmapu
            if (ukladaniObrazku.ShowDialog() == DialogResult.OK)
            {
                
            }
        }

        private void tlSpustit_Click(object sender, EventArgs e)
        {
            Int32 zbyvaTahu = Convert.ToInt32(numPocetTahu.Value);
            List<Prikaz> sekvence = zelva.parseProgram();

            Prikaz aktualni = new Prikaz();
            /*
             * Instruction Pointer. Ukazuje na právě prováděnou položku pole příkazů 
            */
            Int32 eip = -1;
            // Provedení všech tahů
            

            while ((zbyvaTahu > 0) && ((eip-1)<sekvence.Count))
            {
                    eip++;
                    if (!(eip < sekvence.Count)) break;

                    aktualni = sekvence[eip];
                    switch (aktualni.jmeno)
                    {
                        case "forward":
                            Int32 noveX, noveY, dist = aktualni.parametry[0];
                            noveX = Convert.ToInt32(Math.Round(zelva.x + dist * GonioFce.cos(zelva.uhel)));
                            noveY = Convert.ToInt32(Math.Round(zelva.y + dist * GonioFce.sin(zelva.uhel)));

                            if (zelva.penDown)
                            {
                                // želva kreslí, snížíme počet tahů o 1
                                grafikaPole.DrawLine(zelva.pero, new Point(Convert.ToInt32(zelva.x), Convert.ToInt32(zelva.y)), new Point(noveX, noveY));
                                zbyvaTahu--;
                            }

                            zelva.x = noveX;
                            zelva.y = noveY;
                            break;
                        case "pen":
                            // Přehodí pero podle podmínek
                            Int32 param = aktualni.parametry[0];
                            if (param < 1)
                            {
                                zelva.penDown = false;
                            }
                            else
                            {
                                zelva.penDown = true;
                                Color barvaPera = zelva.pero.Color;
                                zelva.pero = new Pen(barvaPera, param);
                            }
                            break;
                        case "right":
                            // Otočí želvu doprava
                            zelva.uhel += Convert.ToInt16(aktualni.parametry[0]);
                            zelva.angleCorrection();
                            
                            break;
                        case "left":
                            // Otočí želvu doprava
                            zelva.uhel -= Convert.ToInt16(aktualni.parametry[0]);
                            zelva.angleCorrection();
                            break;
                        case "color":
                            // oprava chyb
                            Byte r, g, b;
                            r = Convert.ToByte(aktualni.parametry[0]);
                            g = Convert.ToByte(aktualni.parametry[1]);
                            b = Convert.ToByte(aktualni.parametry[2]);
                            if (r < 0) r = 0;
                            if (r > 255) r = 255;
                            if (g < 0) g = 0;
                            if (g > 255) g = 255;
                            if (b < 0) b = 0;
                            if (g > 255) b = 255;

                            // nastavení barvy
                            zelva.pero = new Pen(Color.FromArgb(r, g, b), zelva.pero.Width);
                            break;


                    }
                }
            
        }

        private void tlNasledujici_Click(object sender, EventArgs e)
        {
            
        }

        /// <summary>
        ///  Způsobí reinicializaci, tedy stav, v jakém se nachází program vždy po zapnutí.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            pole.Refresh();
            grafikaPole = pole.CreateGraphics();
            zelva = new Zelva(350,350);
        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }

        private void button1_Click_1(object sender, EventArgs e)
        {
           
        }
    }
}