using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;

using Dapper;

using OAuth2Study.Model;
using OAuth2Study.IDal;


namespace OAuth2Study.Dal.MsSql
{
    public class UserDal : UserIDal
    {
        public (bool result, User user) AddUser(User user)
        {
            int effectRow = 0;
            string sql = "insert into [user] (Name,Password,Age,Gender) values(@Name,@Password,@Age,@Gender)";

            using (IDbConnection connect=new SqlConnection(MsSqlHelper.ConnectString))
            {
                effectRow = connect.Execute(sql,user);
                //或者
                //effectRow = connect.Execute(sql, new { @Name = user.Name,@Password=user.Password, @Age=user.Age, @Gender=user.Gender });
            }

            if (effectRow > 0)
            {
                return ValueTuple.Create(true, user);
            }
            else
            {
                return ValueTuple.Create(false, user);
            }
        }

        public User GetUser(int userId)
        {
            IEnumerable<User> result;
            string querySql = "select * from [user] where id=@id";
            using (IDbConnection connect = new SqlConnection(MsSqlHelper.ConnectString))
            {
               result = connect.Query<User>(querySql, new { userId });
            }

            return result.SingleOrDefault();
        }

        public IQueryable<User> GetUsers()
        {
            IEnumerable<User> result;
            string querySql = "select * from [user]";
            using (IDbConnection connect = new SqlConnection(MsSqlHelper.ConnectString))
            {
                result = connect.Query<User>(querySql);
            }

            return result.AsQueryable();
        }

        public IQueryable<User> GetUsers(Func<User,bool> predicate)
        {
            IEnumerable<User> result;
            string querySql = "select * from [user]";
            using (IDbConnection connect = new SqlConnection(MsSqlHelper.ConnectString))
            {
                result = connect.Query<User>(querySql).Where(predicate);
            }

            return result.AsQueryable();
        }

        public bool RemoveUser(User user)
        {
           return RemoveUser(user.Id);
        }

        public bool RemoveUser(int userId)
        {
            int effectRow = 0;
            string query = "DELETE FROM [user] WHERE id = @id";
            using (IDbConnection connect = new SqlConnection(MsSqlHelper.ConnectString))
            {
                effectRow = connect.Execute(query, new { @id = userId });
            }

            return effectRow > 0;
        }

        public (bool result, User user) UpdateUser(User user)
        {
            int effectRow = 0;
            string updateSql = "Update [user] Set Name=@Name, Password=@Password, Age=@Age, Gender=@Gender WHERE id =@id";
            using (IDbConnection connect = new SqlConnection(MsSqlHelper.ConnectString))
            {
               effectRow = connect.Execute(updateSql, user);
            }

            if (effectRow > 0)
            {
                return ValueTuple.Create(true, user);
            }
            else
            {
                return ValueTuple.Create(false, user);
            }
        }

        public bool ExitsByName(string userName)
        {
            int effectRow = 0;
            string querySql = "IF EXISTS (SELECT id FROM [dbo].[User] WHERE Name=@Name) SELECT 1 ELSE SELECT 0";
            using (IDbConnection connect = new SqlConnection(MsSqlHelper.ConnectString))
            {
               effectRow = connect.ExecuteScalar<int>(querySql, new { @Name = userName});
            }

            return effectRow > 0;
        }
    }
}