;; youth-camp -- Islamic youth camp registration and management
(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-AUTH (err u401))
(define-constant ERR-NONE (err u404))
(define-data-var camp-count uint u0)
(define-data-var total-campers uint u0)
(define-map camps uint { organizer: principal, name: (string-utf8 100), location: (string-utf8 100), capacity: uint, enrolled: uint, active: bool })
(define-map enrollments { camp-id: uint, camper: principal } bool)
(define-public (create-camp (name (string-utf8 100)) (location (string-utf8 100)) (capacity uint))
(let ((id (+ (var-get camp-count) u1)))
(var-set camp-count id)
(map-set camps id { organizer: tx-sender, name: name, location: location, capacity: capacity, enrolled: u0, active: true })
(ok id)))
(define-public (enroll (camp-id uint))
(let ((c (unwrap! (map-get? camps camp-id) ERR-NONE)))
(asserts! (< (get enrolled c) (get capacity c)) ERR-AUTH)
(var-set total-campers (+ (var-get total-campers) u1))
(map-set enrollments { camp-id: camp-id, camper: tx-sender } true)
(map-set camps camp-id (merge c { enrolled: (+ (get enrolled c) u1) }))
(ok true)))
(define-public (close-camp (camp-id uint))
(let ((c (unwrap! (map-get? camps camp-id) ERR-NONE)))
(asserts! (is-eq tx-sender (get organizer c)) ERR-AUTH)
(map-set camps camp-id (merge c { active: false })) (ok true)))
(define-read-only (get-camp (id uint)) (map-get? camps id))
(define-read-only (get-total-campers) (var-get total-campers))