using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Bonhomme02
{
    class Peau : BaseDessin
    {
        public Point coordonnee; // Les coordonée du point seront basé sur le millieux des dessin pour facilité les rotations !
        public Vecteur epaisseur;
        public Vecteur longueur;
        public Peau parent = null;
        public Peau() : base()
        {

        }

        public Peau(PictureBox hebergeur) : base(hebergeur)
        {
        }
        public Peau(PictureBox hebergeur, double lg, double ep, double angle) : base(hebergeur)
        {
            InitVecteurs(lg, ep, angle);
            coordonnee = new Point();
        }
        public Peau(PictureBox hebergeur, int xy) : base(hebergeur)
        {
            coordonnee = new Point(xy,xy);
        }

        public Peau(PictureBox hebergeur, int x, int y, double lg, double ep, double angle) : base(hebergeur)
        {
            InitVecteurs(lg, ep, angle);
            coordonnee = new Point(x, y);
        }
        public Peau(PictureBox hebergeur, ref Peau parent, double lg, double ep, double angle) : base(hebergeur)
        {
            this.parent = parent;
            InitVecteurs(lg, ep, angle);
            coordonnee = new Point();
        }
        /*(0;0)
         *  #---------------------------------------->x
         *  |             Coordonee
         *  |      CIG       |       CID
         *  |       #********#********#
         *  |       *<-------|------->*
         *  |       * -epai. |epaiseur*
         *  |       *       l|        *
         *  |       *       o|        *
         *  |       *       n|        *
         *  |       *       g|        *
         *  |       *       u|        *
         *  |       *       e|        *
         *  |       *       u|        *
         *  |       *       r|        *
         *  |       *       \/        *
         *  |       #*****************#
         *  |      CSG               CSD
         *  | 
         * \/
         *  y
         */
        #region accesseur

        public virtual Point Coordonnee
        {
            get
            {
                if (parent != null)
                {
                    return parent.Coordonnee+parent.longueur;
                }
                else
                    return coordonnee;
            }
            set
            {
                if (parent != null)
                {
                    Console.WriteLine("Un enfant ne peut modifier ces coordonée !");
                }
                else
                {
                    coordonnee = value;
                }
            }
        }
        public int X
        {
            get { return Coordonnee.X; }
        }

        public int Y
        {
            get { return Coordonnee.Y; }
        }
        public double Angle
        {
            get
            {
                return longueur.Angle;
            }
            set
            {
                epaisseur.Angle = value; //Pour que le parent de eppaiseur soit mis a jour
                                         //Si on met longueur, epaisseur ne sera pas mis a jour
            }
        }

        public virtual Point CIG{ get{ return Coordonnee - epaisseur; }}
        public virtual Point CID{ get{ return Coordonnee + epaisseur; }}
        public virtual Point CSG{ get{ return (Coordonnee - epaisseur) + longueur; }}
        public virtual Point CSD{ get{ return (Coordonnee + epaisseur) + longueur; }}
        #endregion

        #region methode
        private void InitVecteurs(double lg, double ep, double angle)
        {
            this.longueur = new Vecteur(lg, angle);
            this.epaisseur =  new Vecteur(ep, ref this.longueur, true);

        }

        public virtual void Afficher(IntPtr handle)
        {
            if(base.Visible)
            {
                try
                {
                    Graphics gr = Graphics.FromHwnd(handle);
                    Point[] l = new Point[4] { CIG, CID, CSD, CSG };
                    if (base.Remplir )
                    {
                            gr.FillClosedCurve(new SolidBrush(base.Fond), l);
                    }
                    gr.DrawClosedCurve(new Pen(base.Crayon), l);
                }
                catch
                {

                }
            }
        }
        public virtual void Cacher(IntPtr handle)
        {
            try
            {
                if (base.Visible && 1 == 1)
                {
                    Graphics gr = Graphics.FromHwnd(handle);
                    Point[] l = new Point[4] { CIG, CID, CSD, CSG };
                    if (base.Remplir)
                    {
                        gr.FillClosedCurve(new SolidBrush(base.Hebergeur.BackColor), l);
                    }
                    gr.DrawClosedCurve(new Pen(base.Hebergeur.BackColor), l);
                }
            }
            catch
            {

            }
        }
        #endregion
    }
}