import {create} from 'zustand';
import {ContentType, Stream, SubtitleTrack} from '../api/addonTypes';

export interface PlayerItem {
  id: string;
  type: ContentType;
  name: string;
  poster?: string;
  videoId?: string;
  season?: number;
  episode?: number;
}

interface PlayerState {
  currentItem: PlayerItem | null;
  currentStream: Stream | null;
  subtitles: SubtitleTrack[];
  selectedSubtitle: SubtitleTrack | null;
  position: number; // seconds
  duration: number; // seconds
  isPaused: boolean;
  isLoading: boolean;
  isBuffering: boolean;
  playbackRate: number;
  // Actions
  play: (item: PlayerItem, stream: Stream) => void;
  pause: () => void;
  resume: () => void;
  setPosition: (pos: number) => void;
  setDuration: (dur: number) => void;
  setSubtitles: (subs: SubtitleTrack[]) => void;
  selectSubtitle: (sub: SubtitleTrack | null) => void;
  setPlaybackRate: (rate: number) => void;
  setBuffering: (val: boolean) => void;
  stop: () => void;
}

export const usePlayerStore = create<PlayerState>((set, _get) => ({
  currentItem: null,
  currentStream: null,
  subtitles: [],
  selectedSubtitle: null,
  position: 0,
  duration: 0,
  isPaused: false,
  isLoading: false,
  isBuffering: false,
  playbackRate: 1.0,

  play: (item, stream) => {
    set({
      currentItem: item,
      currentStream: stream,
      position: 0,
      duration: 0,
      isPaused: false,
      isLoading: true,
      isBuffering: true,
      subtitles: [],
      selectedSubtitle: null,
    });
  },

  pause: () => set({isPaused: true}),
  resume: () => set({isPaused: false}),
  setPosition: pos => set({position: pos}),
  setDuration: dur => set({duration: dur}),
  setSubtitles: subs => set({subtitles: subs}),
  selectSubtitle: sub => set({selectedSubtitle: sub}),
  setPlaybackRate: rate => set({playbackRate: rate}),
  setBuffering: val => set({isBuffering: val, isLoading: val ? false : false}),

  stop: () =>
    set({
      currentItem: null,
      currentStream: null,
      subtitles: [],
      selectedSubtitle: null,
      position: 0,
      duration: 0,
      isPaused: false,
      isLoading: false,
      isBuffering: false,
    }),
}));
