import {
	graphql,
	post,
	del,
	patch,
} from '../api';

import { releaseFields, actorStashesFields, movieFields } from '../fragments';
import { curateStash } from '../curate';

function initStashesActions(store, _router) {
	async function fetchStash(context, {
		stashSlug,
		username,
		section = 'scenes',
		pageNumber = 1,
		limit = 20,
	}) {
		const { stashes: [stash] } = await graphql(`
			query Stash(
				$stashSlug: String!
				$username: String!
				$includeScenes: Boolean!
				$includeActors: Boolean!
				$includeMovies: Boolean!
                $limit:Int = 10,
				$offset:Int = 0,
				$hasAuth: Boolean!
				$userId: Int
			) {
				stashes(
					filter: {
						user: { username: { equalTo: $username } }
						slug: { equalTo: $stashSlug }
					}
				) {
					id
					name
					slug
					public
					primary
					user {
						id
						username
					}
					actorsConnection: stashesActorsConnection(
						orderBy: CREATED_AT_DESC
						first: $limit
						offset: $offset
					) @include(if: $includeActors) {
						totalCount
						actors: nodes {
							comment
							actor {
								id
								name
								slug
								gender
								age
								ageFromBirth
								dateOfBirth
								birthCity
								birthState
								birthCountry: countryByBirthCountryAlpha2 {
								  alpha2
								  name
								  alias
								}
								avatar: avatarMedia {
									id
									path
									thumbnail
									lazy
									isS3
									width
									height
								}
								${actorStashesFields}
							}
						}
					}
					scenesConnection: stashesScenesConnection(
						orderBy: [CREATED_AT_DESC, RELEASE_BY_SCENE_ID__DATE_DESC]
						first: $limit
						offset: $offset
					) @include(if: $includeScenes) {
						totalCount
						scenes: nodes {
							comment
							scene {
								${releaseFields}
							}
						}
					}
					moviesConnection: stashesMoviesConnection(
						orderBy: [CREATED_AT_DESC, MOVIE_BY_MOVIE_ID__DATE_DESC]
						first: $limit
						offset: $offset
					) @include(if: $includeMovies) {
						totalCount
						movies: nodes {
							comment
							movie {
								${movieFields}
							}
						}
					}
				}
			}
		`, {
			stashSlug,
			username,
			includeScenes: section === 'scenes',
			includeActors: section === 'actors',
			includeMovies: section === 'movies',
			offset: Math.max(0, (pageNumber - 1)) * limit,
			limit: Number(limit),
			hasAuth: !!store.state.auth.user,
			userId: store.state.auth.user?.id,
		});

		return curateStash(stash);
	}

	async function createStash(context, stash) {
		return post('/stashes', stash);
	}

	async function updateStash(context, { stashId, stash }) {
		return patch(`/stashes/${stashId}`, stash);
	}

	async function removeStash(context, stashId) {
		await del(`/stashes/${stashId}`);
	}

	async function stashActor(context, { actorId, stashId }) {
		return post(`/stashes/${stashId}/actors`, { actorId });
	}

	async function unstashActor(context, { actorId, stashId }) {
		return del(`/stashes/${stashId}/actors/${actorId}`);
	}

	async function stashScene(context, { sceneId, stashId }) {
		return post(`/stashes/${stashId}/scenes`, { sceneId });
	}

	async function unstashScene(context, { sceneId, stashId }) {
		return del(`/stashes/${stashId}/scenes/${sceneId}`);
	}

	async function stashMovie(context, { movieId, stashId }) {
		return post(`/stashes/${stashId}/movies`, { movieId });
	}

	async function unstashMovie(context, { movieId, stashId }) {
		return del(`/stashes/${stashId}/movies/${movieId}`);
	}

	return {
		createStash,
		fetchStash,
		removeStash,
		stashActor,
		stashScene,
		stashMovie,
		unstashActor,
		unstashScene,
		unstashMovie,
		updateStash,
	};
}

export default initStashesActions;