/********************************************************
 * ADO.NET 2.0 Data Provider for SQLite Version 3.X
 * Written by Robert Simpson (robert@blackcastlesoft.com)
 * 
 * Released to the public domain, use at your own risk!
 ********************************************************/

namespace SQLite.Designer.Design
{
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.ComponentModel;
    using System.Data;
    using System.Data.Common;
    using System.Globalization;

    [TypeConverter( typeof( ExpandableObjectConverter ) )]
    [DefaultProperty( "Enabled" )]
    internal class Unique : IHaveConnection
    {
        private bool _isUnique;
        private ConflictEnum _conflict = ConflictEnum.Abort;
        private Column _column;

        internal Unique( Column col )
            : this( col, null )
        {
        }

        internal Unique( Column col, DataRow row )
        {
            _column = col;
            if ( row != null )
            {
                _isUnique = false;// ( row.IsNull( "UNIQUE" ) == false ) ? ( bool ) row[ "UNIQUE" ] : false;
            }
        }

        #region IHaveConnection Members

        [Browsable( false )]
        public ViewTableBase DesignTable
        {
            get { return _column.DesignTable; }
        }

        public DbConnection GetConnection()
        {
            return ( ( IHaveConnection ) _column ).GetConnection();
        }

        #endregion


        [DefaultValue( false )]
        [DisplayName( "Enabled" )]
        [RefreshProperties( RefreshProperties.All )]
        [Description( "When enabled, all values entered into this column must be unique." )]
        public bool Enabled
        {
            get { return _isUnique; }
            set
            {
                if ( value != _isUnique )
                {
                    _isUnique = value;
                    _column.Table._owner.MakeDirty();
                }
            }
        }

        [DefaultValue( ConflictEnum.Abort )]
        [DisplayName( "On Conflict" )]
        [RefreshProperties( RefreshProperties.All )]
        [Description( "Specifies what action to take when the unique constraint on the column is violated." )]
        public ConflictEnum Conflict
        {
            get { return _conflict; }
            set
            {
                if ( _conflict != value )
                {
                    _conflict = value;

                    if ( _conflict != ConflictEnum.Abort && _isUnique == false )
                        _isUnique = true;

                    _column.Table._owner.MakeDirty();
                }
            }
        }

        public override string ToString()
        {
            if ( _isUnique == false )
                return Convert.ToString( false, CultureInfo.InvariantCulture );
            else
                return String.Format( CultureInfo.InvariantCulture, "{0} ({1})", Convert.ToString( true, CultureInfo.InvariantCulture ), Convert.ToString( Conflict, CultureInfo.InvariantCulture ) );
            //return Convert.ToString(true);
        }
    }

    public enum ConflictEnum
    {
        Abort = 2,
        Rollback = 0,
        Fail = 3,
        Ignore = 4,
        Replace = 5,
    }
}
