;; Eye Clinic - Free eye care for the needy
;; Halal - healing the sick
(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-AUTH (err u401))
(define-constant ERR-NONE (err u404))
(define-data-var patient-count uint u0)
(define-data-var total-donated uint u0)
(define-map patients uint { doctor: principal, condition: (string-utf8 100), treated: bool, block: uint })
(define-map donors principal uint)
(define-public (donate (amount uint))
(let ((prev (default-to u0 (map-get? donors tx-sender))))
(try! (stx-transfer? amount tx-sender CONTRACT-OWNER))
(map-set donors tx-sender (+ prev amount))
(var-set total-donated (+ (var-get total-donated) amount)) (ok amount)))
(define-public (register-patient (condition (string-utf8 100)))
(let ((id (+ (var-get patient-count) u1)))
(asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-AUTH)
(map-set patients id { doctor: tx-sender, condition: condition, treated: false, block: stacks-block-height })
(var-set patient-count id) (ok id)))
(define-public (mark-treated (id uint))
(let ((p (unwrap! (map-get? patients id) ERR-NONE)))
(asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-AUTH)
(map-set patients id (merge p { treated: true })) (ok true)))
(define-read-only (get-patient (id uint)) (map-get? patients id))
(define-read-only (get-donor (who principal)) (ok (default-to u0 (map-get? donors who))))
(define-read-only (get-stats) (ok { patients: (var-get patient-count), donated: (var-get total-donated) }))