// 
// Copyright (C) 2015 Google Inc. All Rights Reserved.
//
//  Licensed under the Apache License, Version 2.0 (the "License");
//  you may not use this file except in compliance with the License.
//  You may obtain a copy of the License at
//
//  http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//    limitations under the License.
// 
#if UNITY_ANDROID
namespace GooglePlayGames
{
    using System.Collections.Generic;
    using GooglePlayGames.BasicApi;
    using UnityEngine;
    using UnityEngine.SocialPlatforms;
    public class PlayGamesLeaderboard : ILeaderboard
    {
        private string mId;
        private UserScope mUserScope;
        private Range mRange;
        private TimeScope mTimeScope;
        private string[] mFilteredUserIds;
        private bool mLoading;
        private IScore mLocalUserScore;
        private uint mMaxRange;
        private List mScoreList = new List();
        private string mTitle;
        public PlayGamesLeaderboard(string id)
        {
            mId = id;
        }
        #region ILeaderboard implementation
        public void SetUserFilter(string[] userIDs)
        {
            mFilteredUserIds = userIDs;
        }
        public void LoadScores(System.Action callback)
        {
            PlayGamesPlatform.Instance.LoadScores(this, callback);
        }
        public bool loading
        {
            get { return mLoading; }
            internal set { mLoading = value; }
        }
        public string id
        {
            get { return mId; }
            set { mId = value; }
        }
        public UserScope userScope
        {
            get { return mUserScope; }
            set { mUserScope = value; }
        }
        public Range range
        {
            get { return mRange; }
            set { mRange = value; }
        }
        public TimeScope timeScope
        {
            get { return mTimeScope; }
            set { mTimeScope = value; }
        }
        public IScore localUserScore
        {
            get { return mLocalUserScore; }
        }
        public uint maxRange
        {
            get { return mMaxRange; }
        }
        public IScore[] scores
        {
            get
            {
                PlayGamesScore[] arr = new PlayGamesScore[mScoreList.Count];
                mScoreList.CopyTo(arr);
                return arr;
            }
        }
        public string title
        {
            get { return mTitle; }
        }
        #endregion
        internal bool SetFromData(LeaderboardScoreData data)
        {
            if (data.Valid)
            {
                OurUtils.Logger.d("Setting leaderboard from: " + data);
                SetMaxRange(data.ApproximateCount);
                SetTitle(data.Title);
                SetLocalUserScore((PlayGamesScore) data.PlayerScore);
                foreach (IScore score in data.Scores)
                {
                    AddScore((PlayGamesScore) score);
                }
                mLoading = data.Scores.Length == 0 || HasAllScores();
            }
            return data.Valid;
        }
        internal void SetMaxRange(ulong val)
        {
            mMaxRange = (uint) val;
        }
        internal void SetTitle(string value)
        {
            mTitle = value;
        }
        internal void SetLocalUserScore(PlayGamesScore score)
        {
            mLocalUserScore = score;
        }
        internal int AddScore(PlayGamesScore score)
        {
            if (mFilteredUserIds == null || mFilteredUserIds.Length == 0)
            {
                mScoreList.Add(score);
            }
            else
            {
                foreach (string fid in mFilteredUserIds)
                {
                    if (fid.Equals(score.userID))
                    {
                        mScoreList.Add(score);
                        break;
                    }
                }
            }
            return mScoreList.Count;
        }
        public int ScoreCount
        {
            get { return mScoreList.Count; }
        }
        internal bool HasAllScores()
        {
            return mScoreList.Count >= mRange.count || mScoreList.Count >= maxRange;
        }
    }
}
#endif