import { useState } from 'react';
import storageAvailable from 'storage-available';

const STORAGE_KEY = 'musician-create-state';

export interface MusicianCreateState {
  activeLyricsMode: 'custom' | 'auto' | 'instrumental';
  activeLyrics: string;
  activeLyricsSubject: string;
  activeLyricsModeTab: 'auto' | 'custom' | 'instrumental';
  activeStyles: string;
  isStylesCollapsed: boolean;
  savedAt: number; // timestamp when saved
  shouldGenerate: boolean;
}

export const saveMusicianCreateState = (
  state: Omit<MusicianCreateState, 'savedAt'>
): boolean => {
  if (!storageAvailable('localStorage')) {
    return false;
  }

  try {
    const stateToSave: MusicianCreateState = {
      ...state,
      savedAt: Date.now(),
    };

    localStorage.setItem(STORAGE_KEY, JSON.stringify(stateToSave));
    return true;
  } catch (error) {
    console.error('Failed to save musician create state:', error);
    return false;
  }
};

export const loadMusicianCreateState = (
  timeOutMs?: number
): MusicianCreateState | null => {
  if (!storageAvailable('localStorage')) {
    return null;
  }

  try {
    const storedState = localStorage.getItem(STORAGE_KEY);
    if (!storedState) {
      return null;
    }

    const parsedState = JSON.parse(storedState) as MusicianCreateState;

    if (timeOutMs && Date.now() - parsedState.savedAt > timeOutMs) {
      return null;
    }

    return parsedState;
  } catch (error) {
    console.error('Failed to load musician create state:', error);
    return null;
  }
};

export const clearMusicianCreateState = (): boolean => {
  if (!storageAvailable('localStorage')) {
    return false;
  }

  try {
    localStorage.removeItem(STORAGE_KEY);
    return true;
  } catch (error) {
    console.error('Failed to clear musician create state:', error);
    return false;
  }
};

export const useMusicianCreateStorage = (
  initialState: Omit<MusicianCreateState, 'savedAt'>
): [MusicianCreateState, (updates: Partial<MusicianCreateState>) => void] => {
  const [state, setState] = useState<MusicianCreateState>(() => {
    const loadedState = loadMusicianCreateState();
    return loadedState || { ...initialState, savedAt: Date.now() };
  });

  const updateState = (updates: Partial<MusicianCreateState>) => {
    setState((prevState) => {
      const newState = { ...prevState, ...updates };
      saveMusicianCreateState(newState);
      return newState;
    });
  };

  return [state, updateState];
};
