/*
 * @copyright Copyright (c) 2021 Jonas Heinrich <onny@project-insanity.org>
 *
 * @author Jonas Heinrich <onny@project-insanity.org>
 *
 * @license GNU AGPL version 3 or any later version
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 *
 */

import axios from '@nextcloud/axios'
import { generateUrl } from '@nextcloud/router'

export class EpisodeApi {

	url(url) {
		url = `/apps/podcast/api${url}`
		return generateUrl(url)
	}

	addEpisode(episode) {
		episode = {
			id: episode.id,
			imgURL: episode.imgURL,
			title: episode.title,
			pubdate: episode.pubdate,
			duration: episode.duration,
			playtime: 0,
			lastplayed: Date.now(),
			enclosure: episode.enclosure,
			description: episode.description.substring(0, 100), // Trim string description, because of MySQL max length field
			podcast_id: episode.podcast_id,
		}
		return axios.post(this.url('/episodes'), episode)
			.then(
				(response) => {
					return Promise.resolve(response.data)
				},
				(err) => {
					return Promise.reject(err)
				}
			)
			.catch((err) => {
				return Promise.reject(err)
			})
	}

	removeEpisode(episode) {
		return axios.delete(this.url(`/episodes/${episode.id}`))
			.then(
				(response) => {
					return Promise.resolve(response.data)
				},
				(err) => {
					return Promise.reject(err)
				}
			)
			.catch((err) => {
				return Promise.reject(err)
			})
	}

	queryEpisodes(podcastId = null, page = 0, sortBy = 'lastplayed') {
		let params = {}
		if (podcastId) {
			params = {
				podcast_id: podcastId,
				count: 20,
				page,
			}
		} else {
			params = {
				count: 20,
				page,
				sortBy,
			}
		}
		return axios.get(this.url('/episodes'), {
			params,
		})
			.then(
				(response) => {
					return Promise.resolve(response.data)
				},
				(err) => {
					return Promise.reject(err)
				}
			)
			.catch((err) => {
				return Promise.reject(err)
			})
	}

	queryEpisode(episodeId) {
		return axios.get(this.url('/episodes'), {
			params: {
				episode_id: episodeId,
			},
		})
			.then(
				(response) => {
					return Promise.resolve(response.data)
				},
				(err) => {
					return Promise.reject(err)
				}
			)
			.catch((err) => {
				return Promise.reject(err)
			})

	}

	updateEpisode({ episode, playtime } = {}) {
		episode = {
			id: episode.id,
			imgURL: episode.imgURL,
			title: episode.title,
			pubdate: episode.pubdate,
			duration: episode.duration,
			playtime,
			lastplayed: Date.now(),
			enclosure: episode.enclosure,
			description: episode.description.substring(0, 100), // Trim string description, because of MySQL max length field
			podcast_id: episode.podcast_id,
		}
		return axios.put(this.url(`/episodes/${episode.id}`), episode)
			.then(
				(response) => {
					return Promise.resolve(response.data)
				},
				(err) => {
					return Promise.reject(err)
				}
			)
			.catch((err) => {
				return Promise.reject(err)
			})
	}

}