-- name: GetListLocations :many
SELECT * FROM locations;

-- name: GetListRecentLocationsWithRatings :many
SELECT
  l.id,
  name,
  thumbnail,
  re.regency_name,
  (SELECT COALESCE(SUM(score), -1) 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), -1) 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
WHERE approved_by IS NOT NULL
ORDER BY l.created_at ASC
LIMIT $1;

-- name: GetLocation :one
SELECT
  l.id,
  l.name,
  l.address,
  l.thumbnail,
  l.submitted_by,
  r.regency_name,
  p.province_name,
  r2.region_name,
  u.username as submitted_by_user
FROM locations l
JOIN regencies r on r.id = l.regency_id
JOIN provinces p on p.id = r.province_id
JOIN regions r2 on r2.id = p.region_id
JOIN users u on l.approved_by = u.id
WHERE l.id = $1;

-- name: CreateLocation :exec
INSERT INTO locations(
  address,
  name,
  submitted_by,
  regency_id,
  google_maps_link
) values (
  $1, $2, $3, $4, $5
);