;; SatGuard Policy Renewal
(define-constant err-nf (err u730))
(define-constant err-unauth (err u731))
(define-constant err-early (err u732))
(define-map renewals {pol-id: uint} {auto: bool,times: uint,la: uint})
(define-read-only (get-renewal (pol-id uint)) (map-get? renewals {pol-id: pol-id}))
(define-public (set-renewal (pol-id uint) (auto bool))
(let ((pol (unwrap! (contract-call? .sg-policy-registry get-policy pol-id) err-nf)))
(asserts! (is-eq tx-sender (get holder pol)) err-unauth)
(map-set renewals {pol-id: pol-id} {auto: auto,times: u0,la: block-height})
(print {e: "renewal-set",pol-id: pol-id,auto: auto})
(ok true)))
(define-read-only (check-expiry (pol-id uint))
(let ((pol (contract-call? .sg-policy-registry get-policy pol-id)))
(match pol
p (ok {expired: (>= block-height (get end p)),blocks-left: (if (>= block-height (get end p)) u0 (- (get end p) block-height))})
(err u730))))
(define-public (renew-policy (pol-id uint))
(let ((pol (unwrap! (contract-call? .sg-policy-registry get-policy pol-id) err-nf))
(rn (default-to {auto: false,times: u0,la: u0} (map-get? renewals {pol-id: pol-id}))))
(asserts! (is-eq tx-sender (get holder pol)) err-unauth)
(asserts! (>= block-height (get end pol)) err-early)
(map-set renewals {pol-id: pol-id} {auto: (get auto rn),times: (+ (get times rn) u1),la: block-height})
(print {e: "policy-renewed",pol-id: pol-id,times: (+ (get times rn) u1)})
(ok true)))