// Code generated by sqlc. DO NOT EDIT.
// versions:
//   sqlc v1.20.0
// source: locations.sql

package db

import (
	"context"
	"database/sql"
)

const getListLocations = `-- name: GetListLocations :many
SELECT id, address, name, google_maps_link, location_type, submitted_by, total_visited, thumbnail, regency_id, is_deleted, created_at, updated_at, approved_by, approved_at FROM locations
`

func (q *Queries) GetListLocations(ctx context.Context) ([]Location, error) {
	rows, err := q.db.QueryContext(ctx, getListLocations)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	items := []Location{}
	for rows.Next() {
		var i Location
		if err := rows.Scan(
			&i.ID,
			&i.Address,
			&i.Name,
			&i.GoogleMapsLink,
			&i.LocationType,
			&i.SubmittedBy,
			&i.TotalVisited,
			&i.Thumbnail,
			&i.RegencyID,
			&i.IsDeleted,
			&i.CreatedAt,
			&i.UpdatedAt,
			&i.ApprovedBy,
			&i.ApprovedAt,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Close(); err != nil {
		return nil, err
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const getListRecentLocationsWithRatings = `-- name: GetListRecentLocationsWithRatings :many
SELECT
  l.id,
  name,
  thumbnail,
  COALESCE(re.regency_name, '') as regency_name,
  COALESCE(pr.province_name, '') as province_name,
  (SELECT COALESCE(SUM(score), 0) from reviews re where re.is_from_critic = true and re.location_id = l.id) as critic_score,
  (SELECT COUNT(id) from reviews re where re.is_from_critic = true and re.location_id = l.id) as critic_count,
  (SELECT COALESCE(SUM(score), 0) from reviews re where re.is_from_critic = false and re.location_id = l.id) as user_score,
  (SELECT COUNT(id) from reviews re where re.is_from_critic = false and re.location_id = l.id) as user_count
FROM locations l
JOIN regencies re on re.id = l.regency_id
JOIN provinces pr on re.province_id = pr.id
WHERE approved_by IS NOT NULL
ORDER BY l.created_at ASC
LIMIT $1
`

type GetListRecentLocationsWithRatingsRow struct {
	ID           int32          `json:"id"`
	Name         string         `json:"name"`
	Thumbnail    sql.NullString `json:"thumbnail"`
	RegencyName  string         `json:"regency_name"`
	ProvinceName string         `json:"province_name"`
	CriticScore  interface{}    `json:"critic_score"`
	CriticCount  int64          `json:"critic_count"`
	UserScore    interface{}    `json:"user_score"`
	UserCount    int64          `json:"user_count"`
}

func (q *Queries) GetListRecentLocationsWithRatings(ctx context.Context, limit int32) ([]GetListRecentLocationsWithRatingsRow, error) {
	rows, err := q.db.QueryContext(ctx, getListRecentLocationsWithRatings, limit)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	items := []GetListRecentLocationsWithRatingsRow{}
	for rows.Next() {
		var i GetListRecentLocationsWithRatingsRow
		if err := rows.Scan(
			&i.ID,
			&i.Name,
			&i.Thumbnail,
			&i.RegencyName,
			&i.ProvinceName,
			&i.CriticScore,
			&i.CriticCount,
			&i.UserScore,
			&i.UserCount,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Close(); err != nil {
		return nil, err
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const getLocationTag = `-- name: GetLocationTag :many
SELECT 
  name
FROM tags 
WHERE tags_type = 'location' 
AND 
target_id = $1
AND
approved_by IS NOT NULL
`

func (q *Queries) GetLocationTag(ctx context.Context, targetID int32) ([]string, error) {
	rows, err := q.db.QueryContext(ctx, getLocationTag, targetID)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	items := []string{}
	for rows.Next() {
		var name string
		if err := rows.Scan(&name); err != nil {
			return nil, err
		}
		items = append(items, name)
	}
	if err := rows.Close(); err != nil {
		return nil, err
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const updateLocationThumbnail = `-- name: UpdateLocationThumbnail :exec
UPDATE locations
SET thumbnail = $1
WHERE id = $2
`

type UpdateLocationThumbnailParams struct {
	Thumbnail sql.NullString `json:"thumbnail"`
	ID        int32          `json:"id"`
}

func (q *Queries) UpdateLocationThumbnail(ctx context.Context, arg UpdateLocationThumbnailParams) error {
	_, err := q.db.ExecContext(ctx, updateLocationThumbnail, arg.Thumbnail, arg.ID)
	return err
}