import {create} from 'zustand';
import AsyncStorage from '@react-native-async-storage/async-storage';
import {DebridProvider} from '../utils/debridService';

const SETTINGS_KEY = 'settings:settings';

export type Theme = 'dark' | 'amoled' | 'light';
export type QualityPref = 'auto' | '1080p' | '720p' | '480p';
export type PosterSize = 'small' | 'medium' | 'large';

interface Settings {
  theme: Theme;
  defaultQuality: QualityPref;
  defaultSubtitleLang: string;
  autoPlayNext: boolean;
  hardwareAcceleration: boolean;
  debridProvider: DebridProvider;
  realDebridKey: string;
  allDebridKey: string;
  premiumizeKey: string;
  posterSize: PosterSize;
  language: string;
}

const DEFAULTS: Settings = {
  theme: 'dark',
  defaultQuality: 'auto',
  defaultSubtitleLang: 'en',
  autoPlayNext: true,
  hardwareAcceleration: true,
  debridProvider: 'none',
  realDebridKey: '',
  allDebridKey: '',
  premiumizeKey: '',
  posterSize: 'medium',
  language: 'en',
};

interface SettingsState extends Settings {
  loaded: boolean;
  load: () => Promise<void>;
  update: <K extends keyof Settings>(key: K, value: Settings[K]) => void;
  reset: () => void;
}

export const useSettingsStore = create<SettingsState>((set, get) => ({
  ...DEFAULTS,
  loaded: false,

  load: async () => {
    const raw = await AsyncStorage.getItem(SETTINGS_KEY);
    if (raw) {
      try {
        const saved = JSON.parse(raw) as Partial<Settings>;
        set({...DEFAULTS, ...saved, loaded: true});
        return;
      } catch {}
    }
    set({loaded: true});
  },

  update: (key, value) => {
    set(state => {
      const next = {...state, [key]: value};
      const {update: _, reset: __, load: ___, loaded: ____, ...settingsOnly} = next;
      AsyncStorage.setItem(SETTINGS_KEY, JSON.stringify(settingsOnly));
      return {[key]: value};
    });
  },

  reset: () => {
    AsyncStorage.removeItem(SETTINGS_KEY);
    set({...DEFAULTS});
  },
}));
