/*
 * SPDX-FileCopyrightText: 2023 jordi fita mas <jfita@peritasoft.com>
 * SPDX-License-Identifier: AGPL-3.0-only
 */

package database

import (
	"context"
	"github.com/jackc/pgtype/zeronull"
	"golang.org/x/text/language"
)

func (tx *Tx) AddAmenity(ctx context.Context, companyID int, label string, name string, info1 string, info2 string) (int, error) {
	return tx.GetInt(ctx, "select add_amenity($1, $2, $3, $4, $5)", companyID, label, name, info1, info2)
}

func (tx *Tx) EditAmenity(ctx context.Context, id int, label string, name string, info1 string, info2 string, active bool) error {
	_, err := tx.Exec(ctx, "select edit_amenity($1, $2, $3, $4, $5, $6)", id, label, name, info1, info2, active)
	return err
}

func (tx *Tx) TranslateAmenity(ctx context.Context, id int, langTag language.Tag, name string, info1 string, info2 string) error {
	_, err := tx.Exec(ctx, "select translate_amenity($1, $2, $3, $4, $5)", id, langTag, name, info1, info2)
	return err
}

func (tx *Tx) AddAmenityCarouselSlide(ctx context.Context, companyID int, label string, mediaID int, caption string) error {
	_, err := tx.Exec(ctx, "select add_amenity_carousel_slide($1, $2, $3, $4)", companyID, label, mediaID, caption)
	return err
}

func (tx *Tx) TranslateAmenityCarouselSlide(ctx context.Context, companyID int, label string, mediaID int, langTag language.Tag, caption string) error {
	_, err := tx.Exec(ctx, "select translate_amenity_carousel_slide($1, $2, $3, $4, $5)", companyID, label, mediaID, langTag, caption)
	return err
}

func (c *Conn) RemoveAmenityCarouselSlide(ctx context.Context, companyID int, label string, mediaID int) error {
	_, err := c.Exec(ctx, "select remove_amenity_carousel_slide($1, $2, $3)", companyID, label, mediaID)
	return err
}

func (c *Conn) OrderAmenityCarousel(ctx context.Context, companyID int, label string, mediaIDs []int) error {
	_, err := c.Exec(ctx, "select order_amenity_carousel($1, $2, $3)", companyID, label, mediaIDs)
	return err
}

func (tx *Tx) AddAmenityFeature(ctx context.Context, companyID int, label string, iconName string, name string) (int, error) {
	return tx.GetInt(ctx, "select add_amenity_feature($1, $2, $3, $4)", companyID, label, iconName, name)
}

func (tx *Tx) EditAmenityFeature(ctx context.Context, id int, iconName string, name string) (int, error) {
	return tx.GetInt(ctx, "select edit_amenity_feature($1, $2, $3)", id, iconName, name)
}

func (tx *Tx) TranslateAmenityFeature(ctx context.Context, id int, langTag language.Tag, name string) error {
	_, err := tx.Exec(ctx, "select translate_amenity_feature($1, $2, $3)", id, langTag, name)
	return err
}

func (c *Conn) OrderAmenityFeatures(ctx context.Context, ids []int) error {
	_, err := c.Exec(ctx, "select order_amenity_features($1)", ids)
	return err
}

func (c *Conn) RemoveAmenityFeature(ctx context.Context, id int) error {
	_, err := c.Exec(ctx, "select remove_amenity_feature($1)", id)
	return err
}

func (c *Conn) RemoveAmenity(ctx context.Context, id int) error {
	_, err := c.Exec(ctx, "select remove_amenity($1)", id)
	return err
}

func (tx *Tx) AddCampsite(ctx context.Context, typeID int, label string, info1 string, info2 string) (int, error) {
	return tx.GetInt(ctx, "select add_campsite($1, $2, $3, $4)", typeID, label, info1, info2)
}

func (tx *Tx) EditCampsite(ctx context.Context, id int, typeID int, label string, info1 string, info2 string, active bool) error {
	_, err := tx.Exec(ctx, "select edit_campsite($1, $2, $3, $4, $5, $6)", id, typeID, label, info1, info2, active)
	return err
}

func (tx *Tx) TranslateCampsite(ctx context.Context, id int, langTag language.Tag, info1 string, info2 string) error {
	_, err := tx.Exec(ctx, "select translate_campsite($1, $2, $3, $4)", id, langTag, info1, info2)
	return err
}

func (tx *Tx) AddCampsiteCarouselSlide(ctx context.Context, label string, companyID int, mediaID int, caption string) error {
	_, err := tx.Exec(ctx, "select add_campsite_carousel_slide($1, $2, $3, $4)", companyID, label, mediaID, caption)
	return err
}

func (tx *Tx) TranslateCampsiteCarouselSlide(ctx context.Context, label string, companyID int, mediaID int, langTag language.Tag, caption string) error {
	_, err := tx.Exec(ctx, "select translate_campsite_carousel_slide($1, $2, $3, $4, $5)", companyID, label, mediaID, langTag, caption)
	return err
}

func (c *Conn) RemoveCampsiteCarouselSlide(ctx context.Context, label string, companyID int, mediaID int) error {
	_, err := c.Exec(ctx, "select remove_campsite_carousel_slide($1, $2, $3)", companyID, label, mediaID)
	return err
}

func (c *Conn) OrderCampsiteCarousel(ctx context.Context, label string, companyID int, mediaIDs []int) error {
	_, err := c.Exec(ctx, "select order_campsite_carousel($1, $2, $3)", companyID, label, mediaIDs)
	return err
}

func (tx *Tx) AddCampsiteFeature(ctx context.Context, label string, companyID int, iconName string, name string) (int, error) {
	return tx.GetInt(ctx, "select add_campsite_feature($1, $2, $3, $4)", companyID, label, iconName, name)
}

func (tx *Tx) EditCampsiteFeature(ctx context.Context, id int, iconName string, name string) (int, error) {
	return tx.GetInt(ctx, "select edit_campsite_feature($1, $2, $3)", id, iconName, name)
}

func (tx *Tx) TranslateCampsiteFeature(ctx context.Context, id int, langTag language.Tag, name string) error {
	_, err := tx.Exec(ctx, "select translate_campsite_feature($1, $2, $3)", id, langTag, name)
	return err
}

func (c *Conn) OrderCampsiteFeatures(ctx context.Context, ids []int) error {
	_, err := c.Exec(ctx, "select order_campsite_features($1)", ids)
	return err
}

func (c *Conn) RemoveCampsiteFeature(ctx context.Context, id int) error {
	_, err := c.Exec(ctx, "select remove_campsite_feature($1)", id)
	return err
}

func (tx *Tx) AddCampsiteType(ctx context.Context, companyID int, mediaID int, name string, spiel string, info string, facilities string, description string, additionalInfo string, checkIn string, checkOut string, maxCampers int, minNights int, maxNights int, overflowAllowed bool, askZonePreferences bool) (string, error) {
	return tx.GetText(ctx, "select add_campsite_type($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, int4range($12, $13), $14, $15)", companyID, mediaID, name, spiel, info, facilities, description, additionalInfo, checkIn, checkOut, maxCampers, minNights, maxNights+1, overflowAllowed, askZonePreferences)
}

func (tx *Tx) EditCampsiteType(ctx context.Context, slug string, mediaID int, name string, spiel string, info string, facilities string, description string, additionalInfo string, checkIn string, checkOut string, maxCampers int, minNights int, maxNights int, overflowAllowed bool, askZonePreferences bool, active bool) (string, error) {
	return tx.GetText(ctx, "select edit_campsite_type($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, int4range($12, $13), $14, $15, $16)", slug, mediaID, name, spiel, info, facilities, description, additionalInfo, checkIn, checkOut, maxCampers, minNights, maxNights+1, overflowAllowed, askZonePreferences, active)
}

func (c *Conn) OrderCampsiteTypes(ctx context.Context, slugs []string) error {
	_, err := c.Exec(ctx, "select order_campsite_types($1)", slugs)
	return err
}

func (tx *Tx) TranslateCampsiteType(ctx context.Context, slug string, langTag language.Tag, name string, spiel string, info string, facilities string, description string, additionalInfo string, checkIn string, checkOut string) error {
	_, err := tx.Exec(ctx, "select translate_campsite_type($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)", slug, langTag, name, spiel, info, facilities, description, additionalInfo, checkIn, checkOut)
	return err
}
func (tx *Tx) SetCampsiteTypeCost(ctx context.Context, slug string, seasonID int, perNight string, perAdult string, perTeenager string, perChild string) error {
	_, err := tx.Exec(ctx, "select set_campsite_type_cost($1, $2, $3, $4, $5, $6)", slug, seasonID, perNight, perAdult, perTeenager, perChild)
	return err
}

func (tx *Tx) SetCampsitePetTypeCost(ctx context.Context, slug string, cost string) error {
	_, err := tx.Exec(ctx, "select set_campsite_type_pet_cost($1, $2)", slug, cost)
	return err
}

func (tx *Tx) UnsetCampsitePetTypeCost(ctx context.Context, slug string) error {
	_, err := tx.Exec(ctx, "select unset_campsite_type_pet_cost($1)", slug)
	return err
}

func (tx *Tx) AddCampsiteTypeOption(ctx context.Context, typeSlug string, name string, min int, max int, perNight bool) (int, error) {
	return tx.GetInt(ctx, "select add_campsite_type_option($1, $2, $3, $4, $5)", typeSlug, name, min, max, perNight)
}

func (tx *Tx) EditCampsiteTypeOption(ctx context.Context, id int, name string, min int, max int, perNight bool) (int, error) {
	return tx.GetInt(ctx, "select edit_campsite_type_option($1, $2, $3, $4, $5)", id, name, min, max, perNight)
}

func (tx *Tx) SetCampsiteTypeOptionCost(ctx context.Context, id int, seasonID int, price string) error {
	_, err := tx.Exec(ctx, "select set_campsite_type_option_cost($1, $2, $3)", id, seasonID, price)
	return err
}

func (tx *Tx) TranslateCampsiteTypeOption(ctx context.Context, id int, langTag language.Tag, name string) error {
	_, err := tx.Exec(ctx, "select translate_campsite_type_option($1, $2, $3)", id, langTag, name)
	return err
}

func (c *Conn) RemoveCampsiteTypeOption(ctx context.Context, id int) error {
	_, err := c.Exec(ctx, "select remove_campsite_type_option($1)", id)
	return err
}

func (c *Conn) OrderCampsiteTypeOptions(ctx context.Context, ids []int) error {
	_, err := c.Exec(ctx, "select order_campsite_type_options($1)", ids)
	return err
}

func (c *Conn) OrderCampsiteTypeCarousel(ctx context.Context, typeSlug string, media_ids []int) error {
	_, err := c.Exec(ctx, "select order_campsite_type_carousel($1, $2)", typeSlug, media_ids)
	return err
}

func (tx *Tx) AddCampsiteTypeFeature(ctx context.Context, typeSlug string, iconName string, name string) (int, error) {
	return tx.GetInt(ctx, "select add_campsite_type_feature($1, $2, $3)", typeSlug, iconName, name)
}

func (tx *Tx) EditCampsiteTypeFeature(ctx context.Context, id int, iconName string, name string) (int, error) {
	return tx.GetInt(ctx, "select edit_campsite_type_feature($1, $2, $3)", id, iconName, name)
}

func (tx *Tx) TranslateCampsiteTypeFeature(ctx context.Context, id int, langTag language.Tag, name string) error {
	_, err := tx.Exec(ctx, "select translate_campsite_type_feature($1, $2, $3)", id, langTag, name)
	return err
}

func (c *Conn) OrderCampsiteTypeFeatures(ctx context.Context, ids []int) error {
	_, err := c.Exec(ctx, "select order_campsite_type_features($1)", ids)
	return err
}

func (c *Conn) RemoveCampsiteTypeFeature(ctx context.Context, id int) error {
	_, err := c.Exec(ctx, "select remove_campsite_type_feature($1)", id)
	return err
}

func (tx *Tx) AddCampsiteTypeCarouselSlide(ctx context.Context, typeSlug string, mediaID int, caption string) error {
	_, err := tx.Exec(ctx, "select add_campsite_type_carousel_slide($1, $2, $3)", typeSlug, mediaID, caption)
	return err
}

func (tx *Tx) TranslateCampsiteTypeCarouselSlide(ctx context.Context, typeSlug string, mediaID int, langTag language.Tag, caption string) error {
	_, err := tx.Exec(ctx, "select translate_campsite_type_carousel_slide($1, $2, $3, $4)", typeSlug, mediaID, langTag, caption)
	return err
}

func (c *Conn) RemoveCampsiteTypeCarouselSlide(ctx context.Context, typeSlug string, mediaID int) error {
	_, err := c.Exec(ctx, "select remove_campsite_type_carousel_slide($1, $2)", typeSlug, mediaID)
	return err
}

func (c *Conn) SetupRedsys(ctx context.Context, companyID int, merchantCode string, terminalNumber int, environment string, integration string, encryptKey string) error {
	var encryptKeyParam interface{}
	if encryptKey != "" {
		encryptKeyParam = encryptKey
	}
	_, err := c.Exec(ctx, "select setup_redsys($1, $2, $3, $4, $5, $6)", companyID, merchantCode, terminalNumber, environment, integration, encryptKeyParam)
	return err
}

func (c *Conn) OrderSeasons(ctx context.Context, slugs []string) error {
	_, err := c.Exec(ctx, "select order_seasons($1)", slugs)
	return err
}

func (tx *Tx) SetupLocation(ctx context.Context, companyID int, directions string, mapEmbed string, openingHours string) error {
	_, err := tx.Exec(ctx, "select setup_location($1, $2, $3, $4)", companyID, directions, mapEmbed, openingHours)
	return err
}

func (tx *Tx) TranslateLocation(ctx context.Context, companyID int, langTag language.Tag, directions string, openingHours string) error {
	_, err := tx.Exec(ctx, "select translate_location($1, $2, $3, $4)", companyID, langTag, directions, openingHours)
	return err
}

func (tx *Tx) TranslateLegalText(ctx context.Context, companyID int, slug string, langTag language.Tag, name string, content string) error {
	_, err := tx.Exec(ctx, "select translate_legal_text($1, $2, $3, $4, $5)", companyID, slug, langTag, name, content)
	return err
}

func (tx *Tx) AddSeason(ctx context.Context, companyID int, name string, color string) (string, error) {
	return tx.GetText(ctx, "select add_season($1, $2, $3)", companyID, name, color)
}

func (tx *Tx) EditSeason(ctx context.Context, slug string, name string, color string, active bool) error {
	_, err := tx.Exec(ctx, "select edit_season($1, $2, $3, $4)", slug, name, color, active)
	return err
}

func (tx *Tx) TranslateSeason(ctx context.Context, slug string, langTag language.Tag, name string) error {
	_, err := tx.Exec(ctx, "select translate_season($1, $2, $3)", slug, langTag, name)
	return err
}

func (tx *Tx) AddService(ctx context.Context, companyID int, icon string, name string, description string) (int, error) {
	return tx.GetInt(ctx, "select add_service($1, $2, $3, $4)", companyID, icon, name, description)
}

func (tx *Tx) EditService(ctx context.Context, id int, icon string, name string, description string) error {
	_, err := tx.Exec(ctx, "select edit_service($1, $2, $3, $4)", id, icon, name, description)
	return err
}

func (tx *Tx) TranslateService(ctx context.Context, id int, langTag language.Tag, name string, description string) error {
	_, err := tx.Exec(ctx, "select translate_service($1, $2, $3, $4)", id, langTag, name, description)
	return err
}

func (c *Conn) OrderServices(ctx context.Context, ids []int) error {
	_, err := c.Exec(ctx, "select order_services($1)", ids)
	return err
}

func (c *Conn) RemoveService(ctx context.Context, id int) error {
	_, err := c.Exec(ctx, "select remove_service($1)", id)
	return err
}

func (tx *Tx) AddSurroundingsHighlight(ctx context.Context, companyID int, mediaID int, name string, description string) (int, error) {
	return tx.GetInt(ctx, "select add_surroundings_highlight($1, $2, $3, $4)", companyID, mediaID, name, description)
}

func (tx *Tx) EditSurroundingsHighlight(ctx context.Context, id int, mediaID int, name string, description string) error {
	_, err := tx.Exec(ctx, "select edit_surroundings_highlight($1, $2, $3, $4)", id, mediaID, name, description)
	return err
}

func (tx *Tx) TranslateSurroundingsHighlight(ctx context.Context, id int, langTag language.Tag, name string, description string) error {
	_, err := tx.Exec(ctx, "select translate_surroundings_highlight($1, $2, $3, $4)", id, langTag, name, description)
	return err
}

func (c *Conn) OrderSurroundingsHighlights(ctx context.Context, ids []int) error {
	_, err := c.Exec(ctx, "select order_surroundings_highlights($1)", ids)
	return err
}

func (c *Conn) RemoveSurroundingsHighlight(ctx context.Context, id int) error {
	_, err := c.Exec(ctx, "select remove_surroundings_highlight($1)", id)
	return err
}

func (tx *Tx) SetupSurroundingsAd(ctx context.Context, companyID int, mediaID int, title string, anchor string, href string) error {
	_, err := tx.Exec(ctx, "select setup_surroundings_ad($1, $2, $3, $4, $5)", companyID, mediaID, title, anchor, href)
	return err
}

func (tx *Tx) TranslateSurroundingsAd(ctx context.Context, companyID int, langTag language.Tag, title string, anchor string) error {
	_, err := tx.Exec(ctx, "select translate_surroundings_ad($1, $2, $3, $4)", companyID, langTag, title, anchor)
	return err
}

func (c *Conn) RemoveSurroundingsAd(ctx context.Context, companyID int) error {
	_, err := c.Exec(ctx, "select remove_surroundings_ad($1)", companyID)
	return err
}

func (tx *Tx) SetupHome(ctx context.Context, companyID int, slogan string) error {
	_, err := tx.Exec(ctx, "select setup_home($1, $2)", companyID, slogan)
	return err
}

func (tx *Tx) TranslateHome(ctx context.Context, companyID int, langTag language.Tag, slogan string) error {
	_, err := tx.Exec(ctx, "select translate_home($1, $2, $3)", companyID, langTag, slogan)
	return err
}

func (c *Conn) ReadyPayment(ctx context.Context, paymentSlug string, customerName string, customerAddress string, customerPostCode string, customerCity string, customerCountryCode string, customerEmail string, customerPhone string, customerLangTag language.Tag) (int, error) {
	return c.GetInt(ctx, "select ready_payment($1, $2, $3, $4, $5, $6, $7, $8, $9)", paymentSlug, customerName, customerAddress, customerPostCode, customerCity, customerCountryCode, customerEmail, customerPhone, customerLangTag)
}

func (tx *Tx) AddBookingFromPayment(ctx context.Context, paymentSlug string) (int, error) {
	return tx.GetInt(ctx, "select add_booking_from_payment($1)", paymentSlug)
}

func (tx *Tx) EditBookingFromPayment(ctx context.Context, bookingSlug string, paymentSlug string) (int, error) {
	return tx.GetInt(ctx, "select edit_booking_from_payment($1, $2)", bookingSlug, paymentSlug)
}

func (tx *Tx) EditBooking(ctx context.Context, bookingID int, customerName string, customerAddress string, customerPostCode string, customerCity string, customerCountryCode string, customerEmail string, customerPhone string, customerLangTag language.Tag, bookingStatus string, campsiteIDs []int) error {
	_, err := tx.Exec(ctx, "select edit_booking($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)", bookingID, customerName, zeronull.Text(customerAddress), zeronull.Text(customerPostCode), zeronull.Text(customerCity), zeronull.Text(customerCountryCode), zeronull.Text(customerEmail), zeronull.Text(customerPhone), customerLangTag, bookingStatus, campsiteIDs)
	return err
}

func (c *Conn) CancelBooking(ctx context.Context, bookingID int) error {
	_, err := c.Exec(ctx, "select cancel_booking($1)", bookingID)
	return err
}

func (c *Conn) CheckInGuests(ctx context.Context, bookingSlug string, guests []*CheckedInGuest) error {
	_, err := c.Exec(ctx, "select check_in_guests(booking_id, $2) from booking where slug = $1", bookingSlug, CheckedInGuestArray(guests))
	return err
}

func (tx *Tx) AddInvoice(ctx context.Context, companyID int, date string, customerID int, notes string, paymentMethodID int, products NewInvoiceProductArray) (string, error) {
	return tx.GetText(ctx, "select add_invoice($1, $2, $3, $4, $5, $6)", companyID, date, customerID, notes, paymentMethodID, products)
}

func (tx *Tx) EditInvoice(ctx context.Context, invoiceSlug string, invoiceStatus string, contactID int, notes string, paymentMethodID int, products EditedInvoiceProductArray) (string, error) {
	return tx.GetText(ctx, "select edit_invoice($1, $2, $3, $4, $5, $6)", invoiceSlug, invoiceStatus, contactID, notes, paymentMethodID, products)
}

func (tx *Tx) AddContact(ctx context.Context, companyID int, name string, idDocumentType string, idDocumentNumber string, phone string, email string, address string, city string, province string, postalCode string, countryCode string) (string, error) {
	return tx.GetText(ctx, "select add_contact($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)", companyID, name, idDocumentType, idDocumentNumber, phone, email, address, city, province, postalCode, countryCode)
}

func (tx *Tx) EditContact(ctx context.Context, contactSlug, name string, idDocumentType string, idDocumentNumber string, phone string, email string, address string, city string, province string, postalCode string, countryCode string) (string, error) {
	return tx.GetText(ctx, "select edit_contact($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)", contactSlug, name, idDocumentType, idDocumentNumber, phone, email, address, city, province, postalCode, countryCode)
}
