;; SatGuard Badges - achievement system
(define-constant err-owner (err u910))
(define-constant err-dup (err u911))
(define-data-var admin principal tx-sender)
(define-data-var b-nonce uint u0)
(define-map badge-types {id: uint} {name: (string-ascii 30),desc: (string-utf8 100)})
(define-map user-badges {who: principal,bid: uint} {aa: uint})
(define-map badge-counts {who: principal} {count: uint})
(define-read-only (get-badge-type (id uint)) (map-get? badge-types {id: id}))
(define-read-only (has-badge (who principal) (bid uint)) (is-some (map-get? user-badges {who: who,bid: bid})))
(define-read-only (get-badge-count (who principal)) (default-to {count: u0} (map-get? badge-counts {who: who})))
(define-public (create-badge-type (name (string-ascii 30)) (desc (string-utf8 100)))
(let ((nid (+ (var-get b-nonce) u1)))
(asserts! (is-eq tx-sender (var-get admin)) err-owner)
(map-set badge-types {id: nid} {name: name,desc: desc})
(var-set b-nonce nid)
(print {e: "badge-type-created",id: nid,name: name})
(ok nid)))
(define-public (award-badge (who principal) (bid uint))
(let ((bt (unwrap! (map-get? badge-types {id: bid}) (err u912)))
(bc (get count (get-badge-count who))))
(asserts! (is-eq tx-sender (var-get admin)) err-owner)
(asserts! (not (has-badge who bid)) err-dup)
(map-set user-badges {who: who,bid: bid} {aa: block-height})
(map-set badge-counts {who: who} {count: (+ bc u1)})
(print {e: "badge-awarded",who: who,bid: bid})
(ok true)))