using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;

namespace Front.Program.Services;

public enum STORAGE_TYPE
{
    Cookie,
    Local,
    Session
}

public class StorageService
{
    private readonly IJSRuntime _js;

    public StorageService(IJSRuntime js)
    {
        _js = js;
    }
    
    public async Task SetItemAsync(string key, string value, STORAGE_TYPE type = STORAGE_TYPE.Session, int expire_time = 1)
    {
        await (type switch
        {
            STORAGE_TYPE.Cookie => _js.InvokeVoidAsync("setCookie", key, value, expire_time),
            STORAGE_TYPE.Local => _js.InvokeVoidAsync("localStorage.setItem", key, value),
            STORAGE_TYPE.Session => _js.InvokeVoidAsync("sessionStorage.setItem", key, value),
            _ => throw new ArgumentException("Invalid storage type")
        });
    }
    
    public async Task<string?> GetItemAsync(string key, STORAGE_TYPE type = STORAGE_TYPE.Session)
    {
        return type switch
        {
            STORAGE_TYPE.Cookie => await _js.InvokeAsync<string>("getCookie", key),
            STORAGE_TYPE.Local => await _js.InvokeAsync<string>("localStorage.getItem", key),
            STORAGE_TYPE.Session => await _js.InvokeAsync<string>("sessionStorage.getItem", key),
            _ => null
        };
    }
    
    public async Task<bool> RemoveItemAsync(string key, STORAGE_TYPE type = STORAGE_TYPE.Session)
    {
        try
        {
            await (type switch
            {
                STORAGE_TYPE.Cookie => _js.InvokeVoidAsync("deleteCookie", key),
                STORAGE_TYPE.Local => _js.InvokeVoidAsync("localStorage.removeItem", key),
                STORAGE_TYPE.Session => _js.InvokeVoidAsync("sessionStorage.removeItem", key),
                _ => throw new ArgumentException("Invalid storage type")
            });
            return true;
        }
        catch
        {
            return false;
        }
    }
} 

/* 스토리지 종류
1.  Cookie 
    만료일 : 명시적으로 설정이 가능 (설정에 따라 그 값을 변경 가능)
    접근성 : 서버와 클라이언트 모두 접근이 가능함
    특징
        1. HTTP 요청마다 서버로 전송이 되며 도메인/경로 제한이 가능하다.
        2. HttpOnly나 secure 옵션으로 보안 설정이 가능하다.
2. Local
    만료일 : 브라우저 데이터 삭제 전까지는 영구 보관 가능
    접근성 : 클라이언트 측에서 JS 를 통해서만 접근이 가능
    특징
        1. 도메인별로 분리된 저장소로 동기적인 동작이 된다.
        2. 문자열만 저장이 가능하다.
3. Sesson
    만료일 : 브라우저의 탭/창 닫을 때 까지 보관 (닫게 되면 삭제)
    접근성 : 클라이언트 측에서 JS 를 통해서만 접근이 가능
    특징 
        1. 탭/창 별로 불리된 저장소며 동기적인 동작이 가능하다.
        2. 문자열만 저장이 가능하다.
        */
