// SPDX-License-Identifier: GPL-3.0-or-later

// This file is part of the http://github.com/aaronbloomfield/ccc repoistory,
// and is released under the GPL 3.0 license.

pragma solidity ^0.8.24;

interface IDebts {

    // holds in the necessary information about each alias / entry
    struct Entry {
        uint id;            // the index in the 'entries' mapping
        string thealias;    // their string alias
        string name;        // their string name
        address addr;       // their account address
        int balance;        // how much they owe (if negative) or are owed (if positive)
    }

    // allow notification when a debt is entered
    event paidEvent();

    // allow notification when an alias is entered
    event aliasAddedEvent();


    // holds all the alias entry structs from above; as we are going to call
    // this from Javascript, which will not know about the Entry struct type,
    // we have to return a tuple of all the Entry fields (which is what the
    // automatic getter function will do); create it via:
    // mapping (uint => Entry) public entries;
    function entries(uint) external returns (uint, string memory, string memory, address, int);

    // holds true if that account address has an entry in 'entries'; create it
    // via:
    // mapping (address => bool) public addressHasEntry;
    function addressHasEntry(address) external returns (bool);

    // holds true if that alias has an entry in 'entries'; create it via:
    // mapping (string => bool) public aliasHasEntry;
    function aliasHasEntry(string memory) external returns (bool);

    // given an alias, this will give the index into the 'entries' array for
    // that alias; create it via:
    // mapping (string => uint) public findByAlias;
    function findByAlias(string memory) external returns (uint);

    // given an account address, this will give the index into the 'entries'
    // array for that account address; create it via:
    // mapping (address => uint) public findByAddress;
    function findByAddress(address) external returns (uint);

    // how many alias exist in the 'entries' mapping; create it via:
    // uint public num_entries;
    function num_entries() external returns (uint);

    // add an alias and associated name to the mapping; the address is assumed
    // to be msg.sender
    function addAlias (string memory _alias, string memory _name) external;

    // enter a debt, in either direction, between the current account and the
    // provided alias
    function payToAlias (string memory _alias, int amount) external;

    // the implementation for this is provdied in Debts.sol, and it's usage is
    // explained later in the course
    function supportsInterface(bytes4 interfaceId) external pure returns (bool);

}