// SPDX-License-Identifier: MIT
pragma solidity 0.8.23;

/**
 * @title AERE Season 1 "Altitude" — shared interfaces
 * @notice Minimal interfaces so the Season 1 suite can be wired to LIVE chain
 *         2800 contracts without importing their full source. All external
 *         oracle references (humanity / passkey) are Foundation-settable and
 *         wired POST-DEPLOY to the appropriate live source, so nothing here
 *         hardcodes an ABI we cannot verify.
 *
 *  HONESTY / DISCLAIMER (mandatory for all user-facing copy that surfaces
 *  Altitude Points or Season 1 rewards): Altitude Points (AP) are NOT a
 *  token. They are non-transferable and have no guaranteed monetary value.
 *  Any future reward depends on the network growing and is not promised.
 *  There is no listing. Nothing here is an offer of, or a right to, value
 *  or returns.
 */

/// @notice Non-transferable Season 1 points ledger (credit-only).
interface IAerePointsLedger {
    function credit(address account, uint256 amount, bytes32 questId) external;
    function balanceOf(address account) external view returns (uint256);
    function isAttestor(address who) external view returns (bool);
}

/// @notice Quest configuration registry.
interface IAereQuestRegistry {
    struct Quest {
        uint256 weight;              // points credited per completion
        uint64  startTime;           // window open (unix)
        uint64  endTime;             // window close (unix); 0 == open-ended
        uint256 perUserCap;          // max cumulative points per user for this quest
        bool    active;              // Foundation kill-switch
        bool    requiresVerifiedHuman;
        bool    exists;
    }

    function getQuest(bytes32 questId) external view returns (Quest memory);
    function isOpen(bytes32 questId, uint256 atTime) external view returns (bool);
}

/// @notice First-Flight soulbound check-in attestation.
interface IAereQuestCheckIn {
    function hasCheckedIn(address account) external view returns (bool);
}

/// @notice Per-account quest completion accounting exposed by the attestor.
interface IAereQuestAttestor {
    function distinctQuestCount(address account) external view returns (uint256);
    function earned(address account, bytes32 questId) external view returns (uint256);
}

/**
 * @notice Generic "is this account verified as a human?" oracle. The Foundation
 *         wires this to an adapter over AereZKScreen (over-18 / EU-residency
 *         program clearance) + AereSanctionsRegistry (not sanctioned). Kept as a
 *         settable reference so the compliance source can evolve without
 *         redeploying the attestor.
 */
interface IHumanityOracle {
    function isVerifiedHuman(address account) external view returns (bool);
}

/**
 * @notice Generic boolean flag oracle. Used by the referral registry to check
 *         "has this account created a passkey smart account?" The Foundation
 *         wires it to a passkey-account indexer/attestor (the live
 *         AerePasskeyAccountFactoryV2 emits AccountCreated but keeps no queryable
 *         on-chain set, so an attested flag source is used).
 */
interface IAccountFlag {
    function isFlagged(address account) external view returns (bool);
}

/// @notice Wrapped-AERE (WETH-style) surface used by the reward distributor to
///         convert native AERE into WAERE for the sAERE-delivery path.
interface IWaereWrap {
    function deposit() external payable;
    function approve(address spender, uint256 amount) external returns (bool);
    function transfer(address to, uint256 amount) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
}

/// @notice Minimal ERC-4626 surface for sAERE (deposit WAERE, mint sAERE to receiver).
interface ISAEREVault {
    function deposit(uint256 assets, address receiver) external returns (uint256 shares);
    function asset() external view returns (address);
}
