;; ummah-vote -- community shura (consultation) voting system
(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-AUTH (err u401))
(define-constant ERR-NONE (err u404))
(define-data-var proposal-count uint u0)
(define-map proposals uint { proposer: principal, title: (string-utf8 200), yes-votes: uint, no-votes: uint, status: (string-ascii 20), block: uint })
(define-map votes { proposal-id: uint, voter: principal } bool)
(define-public (create-proposal (title (string-utf8 200)))
(let ((id (+ (var-get proposal-count) u1)))
(var-set proposal-count id)
(map-set proposals id { proposer: tx-sender, title: title, yes-votes: u0, no-votes: u0, status: "open", block: stacks-block-height })
(ok id)))
(define-public (cast-vote (proposal-id uint) (support bool))
(let ((p (unwrap! (map-get? proposals proposal-id) ERR-NONE)))
(asserts! (is-none (map-get? votes { proposal-id: proposal-id, voter: tx-sender })) ERR-AUTH)
(map-set votes { proposal-id: proposal-id, voter: tx-sender } support)
(if support
(map-set proposals proposal-id (merge p { yes-votes: (+ (get yes-votes p) u1) }))
(map-set proposals proposal-id (merge p { no-votes: (+ (get no-votes p) u1) })))
(ok true)))
(define-public (close-proposal (proposal-id uint))
(let ((p (unwrap! (map-get? proposals proposal-id) ERR-NONE)))
(asserts! (is-eq tx-sender (get proposer p)) ERR-AUTH)
(map-set proposals proposal-id (merge p { status: "closed" })) (ok true)))
(define-read-only (get-proposal (id uint)) (map-get? proposals id))
(define-read-only (get-proposal-count) (var-get proposal-count))