using Blazored.LocalStorage;
using Microsoft.AspNetCore.Components.Authorization;
using System.Net.Http;
using System.Net.Http.Json;
using System.Threading.Tasks;
using wispro.sp.web.Auth;
using wispro.sp.web.Models;
using wispro.sp.web.Utils;
using System.Security.Claims;
using System.Collections.Generic;
using wispro.sp.entity;
using System;
using wispro.sp.share.webViewObject;
using System.Text.Json;

namespace wispro.sp.web.Services
{
    public interface IUserService
    {
        //CurrentUser CurrentUser { get; set; }

        Task<List<Staff>> GetAll();

        Task<CurrentUser> GetUser();
    }

    public class UserService : IUserService
    {
        private readonly IHttpService  _httpClient;
        private readonly JwtAuthenticationStateProvider _jwt;
        private readonly ILocalStorageService _localStorageService;
        //private CurrentUser _CurrentUser= new CurrentUser() { Name = "" };

        public UserService(IHttpService httpClient, ILocalStorageService localStorageService, AuthenticationStateProvider jwt)
        {
            _httpClient = httpClient;
            _localStorageService = localStorageService;
            _jwt = (JwtAuthenticationStateProvider)jwt;
        }


        //public CurrentUser CurrentUser
        //{
        //    get
        //    {
        //        return _CurrentUser;
        //    }
        //    set
        //    {
        //        _CurrentUser = value;
        //    }
            
        //}

        public async Task<CurrentUser> GetUser()
        {
            CurrentUser _user = new CurrentUser();
            var tokenInLocalStorage = await _localStorageService.GetItemAsync<userToken>("authToken");

            if (tokenInLocalStorage == null)
            {
                _jwt.NotifyUserLogOut();
                return null;
            }

            var claims = JwtParser.ParseClaimsFromJwt(tokenInLocalStorage.Token);

            foreach (Claim claim in claims)
            {
                if (claim.Type == ClaimTypes.Name )
                {
                    _user.Name = claim.Value;
                    break;
                }
            }

            _user.Userid = tokenInLocalStorage.UserId;

            return _user;
        }

        public async Task<List<Staff>> GetAll()
        {
            try
            {
                var _StaffGrade = await _httpClient.Get<List<Staff>>($"Staff/GetAll");
                return _StaffGrade;
            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("Unauthorized"))
                {
                    _jwt.NotifyUserLogOut();
                }

                return null;

            }
        }

        
    }
}