using System;
using System.Diagnostics.CodeAnalysis;
using SDA.DataProvider.Core;

namespace SDA.DataProvider
{
    /// <summary>
    /// Egy konkrét táblára vonatkozó <c>DML</c> utasításokat generál.
    /// </summary>
    public class SDACommandBuilder : IDisposable
    {
        internal SDACommandBuilderWrapper CommandBuilder;

        /// <summary>
        /// Az osztály alapértelmezett konstruktora.
        /// </summary>
        public SDACommandBuilder()
        {
            CommandBuilder = SDAFactory.Instance.CreateCommandBuilder();
        }

        /// <summary>
        /// Az osztály konstruktora.
        /// </summary>
        /// <param name="dataAdapter"></param>
        public SDACommandBuilder(SDADataAdapter dataAdapter)
        {
            if (dataAdapter == null)
            {
                throw new ArgumentNullException(nameof(dataAdapter));
            }

            CommandBuilder = SDAFactory.Instance.CreateCommandBuilder(dataAdapter.DataAdapter);
        }

        /// <summary>
        /// Paraméterek kötése.
        /// </summary>
        public void DeriveParameters(SDACommand command)
        {
            if (command == null)
            {
                throw new ArgumentNullException(nameof(command));
            }

            CommandBuilder.DeriveParameters(command.Command);
        }

        /// <summary>
        /// Visszaadja a törlő parancs objektumot.
        /// </summary>
        /// <returns></returns>
        [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")]
        public SDACommand GetDeleteCommand()
        {
            return new SDACommand(CommandBuilder.GetDeleteCommand());
        }

        /// <summary>
        /// Beszúrás parancs.
        /// </summary>
        [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")]
        public SDACommand GetInsertCommand()
        {
            return new SDACommand(CommandBuilder.GetInsertCommand());
        }

        /// <summary>
        /// Módosítás parancs.
        /// </summary>
        [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")]
        public SDACommand GetUpdateCommand()
        {
            return new SDACommand(CommandBuilder.GetUpdateCommand());
        }

        /// <summary>
        /// Séma frissítése.
        /// </summary>
        public void RefreshSchema()
        {
            CommandBuilder.RefreshSchema();
        }

        /// <summary>
        /// Eldobja az objektumot.
        /// </summary>
        public void Dispose()
        {
            CommandBuilder.Dispose();
            CommandBuilder = null;
        }
    }
}