using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
 
namespace ConsoleApplication1
{
 
    public class Empleado
    {
        private string nombre, puesto, domicilo, email, telefono;
        private float sueldo;
 
        public Empleado()
        { }
        // constructor por default
 
        public Empleado(string n, string p, float s, string dom, string tel, string eml) //constructor empleado
        {
            nombre = n;
            puesto = p;
            sueldo = s;
            domicilo = dom;
            telefono = tel;
            email = eml;
 
        }
 
        public void asignaNombre(string n)
        
        { nombre = n; }
 
        public string obtenNombre()
        { return nombre; }
 
        public void asignaPuesto(string p)
        { puesto = p; }
 
        public string obtenPuesto()
        { return puesto; }
 
        public void asignaSueldo(float s)
        { sueldo = s; }
 
        public float obtenSueldo()
        { return sueldo; }
 
        public void asgniaDomicilio(string dom)
        { domicilo = dom; }
 
        public string obtenDomicilio()
        { return domicilo; }
 
        public void asignaTelefono(string tel)
        { telefono = tel; }
 
        public string obtenTelefono()
        { return telefono; }
 
        public void asignaEmail(string eml)
        { email = eml; }
 
        public string obtenEmail()
        { return email; }
    
    }
 
    public class ArchivoEmpleados
    {
        private FileStream fs=null; //Flujo base.
        private BinaryWriter bw=null; // Flujo de escritura
        private BinaryReader br=null; // Flujo de lectura
        public ushort nregs; // Numero de registros en el archivo
        public static ushort tamanoRegistro = 82; //Tamano del registro, en bytes, se agregan 2 bytes por cada string.
        public ushort c;
        public string n, p, dom, emal, tel;
        public float s;
 
        public ArchivoEmpleados(string archivo)//Constructor archivo
        {
            fs 
= new FileStream
(archivo, FileMode
.OpenOrCreate, FileAccess
.ReadWrite);            bw 
= new BinaryWriter
(fs
);            br 
= new BinaryReader
(fs
);            nregs = (ushort)Math.Ceiling((double)fs.Length / (double)tamanoRegistro);
        }
 
        public void cierraArchivo()
        {
            bw.Close();
            br.Close();
            fs.Close();
        }
 
        public ushort obtenNumeroDeRegistros()
        { return nregs; }
 
        public void escribeRegistro(ushort clave, Empleado empleado)
        {
 
            if (clave > 0 && clave <= (nregs + 1))
            {
                bw.BaseStream.Seek((clave - 1) * tamanoRegistro, SeekOrigin.Begin);
                bw.Write(empleado.obtenNombre());
                bw.Write(empleado.obtenPuesto());
                bw.Write(empleado.obtenSueldo());
                bw.Write(empleado.obtenDomicilio());
                bw.Write(empleado.obtenTelefono());
                bw.Write(empleado.obtenEmail());
            }
 
            else
            { Console.WriteLine("Clave incorrecta..."); }
        }
 
        public void captura()
        {
            try
            {
                Console.Write("Nombre: ");
                n = Console.ReadLine();
                n = n.PadRight(50);
                Console.Write("Puesto: ");
                p = Console.ReadLine();
                p = p.PadRight(20);
                Console.Write("Sueldo: ");
                s = Single.Parse(Console.ReadLine());
                Console.Write("Domicilio: ");
                dom = Console.ReadLine();
                dom = dom.PadRight(100);
                Console.Write("Telefono: ");
                tel = Console.ReadLine();
                Console.Write("Email: ");
                emal = Console.ReadLine();
                emal = emal.PadRight(100);
            }
            catch (FormatException fex)
            {
                Console.WriteLine("nMensaje del Error: " + fex.Message);
                Console.WriteLine("nRuta del Error: " + fex.StackTrace);
                Console.WriteLine("nPresione <Enter> para Continuar... ");
                Console.ReadKey();
            }
        }
 
        public void anadeRegistro(Empleado empleado)
        {
            nregs++;
            bw.BaseStream.Seek(nregs * tamanoRegistro, SeekOrigin.Begin);
            captura();
            escribeRegistro
(nregs, 
new Empleado
(n, p, s, dom, tel, emal
));        }
 
        public Empleado leeRegistro(ushort reg)
        {
            if (reg >= 0 && reg < nregs)
            {
                br.BaseStream.Seek(reg * tamanoRegistro,SeekOrigin.Begin);
                n = br.ReadString();
                p = br.ReadString();
                s = br.ReadSingle();
                dom = br.ReadString();
                tel = br.ReadString();
                emal = br.ReadString();
                return new Empleado
(n, p, s, dom, tel, emal
);             }
 
            else
            {
                Console.WriteLine("Clave incorrecta...");
                return null;
            }
        }
 
        public void buscaRegistro()
        {
            try
            {
                do
                {
                    Console.Write("Clave: ");
                    c = UInt16.Parse(Console.ReadLine());
                }while (c < 1 && c > nregs);
 
                br.BaseStream.Seek((c - 1) * tamanoRegistro, SeekOrigin.Begin);
                n = br.ReadString();
                n = n.TrimEnd(' ');
                p = br.ReadString();
                p = p.TrimEnd(' ');
                s = br.ReadSingle();
                dom = br.ReadString();
                dom = dom.TrimEnd(' ');
                tel = br.ReadString();
                tel = tel.TrimEnd(' ');
                emal = br.ReadString();
                emal = emal.TrimEnd(' ');
                Console.Clear();
                Console.Write("nClave> " + c);
                Console.Write("nNombre: " + n);
                Console.Write("nPuesto: " + p);
                Console.Write("nSueldo: {0:F2} ", s);
                Console.Write("nDomicilio: " + dom);
                Console.Write("nTelefono: " + tel);
                Console.Write("nEmail: " + emal);
                Console.WriteLine("nnPresione <Enter> para Continuar...");
                Console.ReadLine();
                br.BaseStream.Seek((c - 1) * tamanoRegistro, SeekOrigin.Begin);
            }
 
            catch (FormatException fex)
            {
                Console.WriteLine("nMensaje del Error: " + fex.Message);
                Console.WriteLine("nRuta del Error: " + fex.StackTrace);
                Console.WriteLine("nPresione <Enter> para Continuar... ");
                Console.ReadKey();
 
            }
 
            catch (IOException ioex)
            {
                Console.WriteLine("nMensaje del Error: " + ioex.Message);
                Console.WriteLine("nRuta del Error: " + ioex.StackTrace);
                Console.WriteLine("nPresione <Enter> para Continuar... ");
                Console.ReadKey();
            }
        }
 
        public void cambiaRegistro()
        {
            buscaRegistro();
            Console.Write("nDesea cambiarlo(S/N)? : ");
            char op;
 
            do
            {
                op = (char)Console.Read();
                op = Char.ToUpper(op);
            }
 
            while (op != 'N' && op != 'S');
 
            Console.ReadLine();
 
            if (op == 'S')
            {
                captura();
                Empleado e 
= new Empleado
(n, p, s, dom, tel, emal
);                escribeRegistro((ushort)(c), e);
            }
        }
 
        public void desplieguaRegistros()
        {
            Console.Clear();
            int i;
            for (i = 0; br.BaseStream.Length != br.BaseStream.Position; i++)
            {
                br.BaseStream.Seek(i * tamanoRegistro, SeekOrigin.Begin);
                n = br.ReadString();
                n = n.TrimEnd(' ');
                p = br.ReadString();
                p = p.TrimEnd(' ');
                s = br.ReadSingle();
                dom = br.ReadString();
                dom = dom.TrimEnd(' ');
                tel = br.ReadString();
                tel = tel.TrimEnd();
                emal = br.ReadString();
                emal = emal.TrimEnd(' ');
 
                Console.Write("nn------------------------nClave: " + (i + 1));
                Console.Write("nNombre: " + n);
                Console.Write("nPuesto: " + p);
                Console.Write("nSueldo: {0:F2}", s);
                Console.Write("nDomicilio: " + dom);
                Console.Write("nTelefono: " + tel);
                Console.Write("nEmail: " + emal);
            }
 
            Console.WriteLine("nnPresione <Enter> para Continuar...");
            Console.ReadLine();
            br.BaseStream.Seek(0, SeekOrigin.Begin);
        }
 
        public void eliminaRegistro()
        {
            buscaRegistro();
            Console.Write("nDesea elimiarlo? (S/N): ");
            char op;
 
            do
            {
                op = (char)Console.Read();
                op = Char.ToUpper(op);
            }
 
            while (op != 'N' && op != 'S');
 
            if (op == 'S')
            {
                n = "Registro Eliminado";
                n = n.PadRight(50);
                p = "Registro Eliminado";
                p = p.PadRight(50);
                s = 0;
                Empleado e 
= new Empleado
(n, p, s, dom, tel, emal
);                escribeRegistro(c, e);
            }
        }
    }
 
    public class Principal
    {
        static ArchivoEmpleados arEmp;
 
        public static char menu()
        {
            Console.Clear();
            Console.WriteLine("A.- Agregar. ");
            Console.WriteLine("B.- Buscar. ");
            Console.WriteLine("C.- Cambiar. ");
            Console.WriteLine("D.- Desplegar. ");
            Console.WriteLine("E.- Eliminar. ");
            Console.WriteLine("S.- Salir. ");
            Console.Write("nOpcion: ");
 
            char op;
            op = (char)Console.Read();
            op = Char.ToUpper(op);
 
            Console.WriteLine(); Console.ReadLine();
            return op;
        }
 
        public static void Main(string[] args)
        {
            string archivo = "Empleados.dat";
            arEmp 
= new ArchivoEmpleados
(archivo
);            char opcion;
 
            do
            {
                opcion = menu();
                opcion = Char.ToUpper(opcion);
 
                switch (opcion)
                {
 
                    case 'A':
                        {
                            arEmp
.anadeRegistro(new Empleado
(arEmp
.n, arEmp
.p, arEmp
.s, arEmp
.dom, arEmp
.tel, arEmp
.emal));                        }
                        break;
 
                    case 'B':
                        { arEmp.buscaRegistro(); }
                        break;
 
                    case 'C':
                        { arEmp.cambiaRegistro(); }
                        break;
 
                    case 'D':
                        { arEmp.desplieguaRegistros(); }
                        break;
 
                    case 'E':
                        { arEmp.eliminaRegistro(); }
                        break;
 
                    case 'S':
                        {
                            arEmp.cierraArchivo();
                            Console.Clear();
                            Console.WriteLine("Fin del Programa!!!");
                            Console.WriteLine("nPresione <Enter> para Salir..");
                            Console.ReadLine();
                        }
 
                        break;
 
                    default:
                        {
                            Console.WriteLine("Opcion no valida! Presione <Enter> para continuar..");
                            Console.ReadKey();
                        }
                        break;
                }
            }
 
            while (opcion != 'S');
        }
    }
}