import { defineStore, storeToRefs } from 'pinia'
import { getCookie, setCookie } from 'typescript-cookie'
import { useCookies } from 'vue3-cookies'
import { BasicColumns, ColumnInfo, ColumnName, Columns, DetailsColumns, MoveColumns } from '../lib/columns'
import { Reviver, StoreChars, StoreColSet, StoreInvs, StoreStr, StoreStrSet } from '../lib/storage'
import { ColumnSet } from '../lib/table'
import { TricksterCharacter, TricksterInventory } from '../lib/trickster'
import { nameCookie} from '../session_storage'

const _defaultColumn:(ColumnInfo| ColumnName)[] = [
  ...BasicColumns,
  ...MoveColumns,
  ...DetailsColumns,
]
export const useStore = defineStore('state', {
  state: ()=> {
    let store = {
      invs: new Map() as Map<string,TricksterInventory>,
      chars: new Map() as Map<string,TricksterCharacter>,
      accounts: new Set() as Set<string>,
      activeTable: "none",
      screen:  "default",
      columns:new ColumnSet(_defaultColumn),
      tags: new ColumnSet(),
      dirty: 0,
    }
    loadStore();
    return store
  }
})

export const StoreReviver = {
  chars: StoreChars,
  accounts: StoreStrSet,
  activeTable: StoreStr,
  screen: StoreStr,
  columns: StoreColSet,
  tags: StoreColSet,
}

export interface StoreProps  {
  invs: Map<string,TricksterInventory>
  chars: Map<string, TricksterCharacter>
  accounts: Set<string>
  activeTable: string
  screen: string
  columns: ColumnSet
  tags: ColumnSet
  dirty: number
}
export const loadStore = ()=> {
  let store = useStoreRef()
  for(const [k, v] of Object.entries(StoreReviver)){
    const coke = localStorage.getItem(nameCookie("last_"+k))
    if(coke){
      if((store[k as keyof RefStore]) != undefined){
        store[k as keyof RefStore].value = v.Revive(coke) as any
      }
    }
  }
}
export const saveStore = ()=> {
  let store = useStoreRef()
  for(const [k, v] of Object.entries(StoreReviver)){
    let coke;

    if((store[k as keyof RefStore]) != undefined){
      coke = v.Murder(store[k as keyof RefStore].value as any)
    }
    if(coke){
      localStorage.setItem(nameCookie("last_"+k),coke)
    }
  }
}

export const useStoreRef = ()=>{
  const refs = storeToRefs(useStore())
  return refs
};

export type RefStore = ReturnType<typeof useStoreRef>;