// ============================================================
// SBTItem — Soulbound Token (непередаваемый токен)
// Стандарт TEP-86 для TON blockchain
// Хранит данные о члене гильдии: роль, рейтинг, статус
// ============================================================

// Сообщение на сжигание (удаление) SBT-токена
// Может отправить только коллекция-владелец
message(0xa002) BurnSBT {
    index: Int as uint256;      // ID токена
}

// Сообщение на установку рейтинга
// Может отправить только коллекция-владелец
message(0xa003) SetRating {
    index: Int as uint256;      // ID токена
    rating: Int as uint32;      // Новый рейтинг (0-999)
}

// Структура данных SBT-токена
struct SBTItemData {
    role: Int as uint8;         // Роль: 1=Lehrling, 2=Geselle, 3=Meister
    rating: Int as uint32;      // Рейтинг мастера
    issuedAt: Int as uint32;    // Дата выпуска (unix timestamp)
    active: Bool;               // Активен ли токен (false = сожжён)
    owner: Address;             // Владелец токена
    collectionAddr: Address;    // Адрес коллекции, которая выпустила токен
}

// События
message RatingSet {
    id: Int as uint256;
    newRating: Int as uint32;
}

message SBTBurned {
    id: Int as uint256;
}

// Контракт SBT-токена (один экземпляр на каждого участника)
contract SBTItem {
    id: Int as uint256;         // Уникальный идентификатор токена
    data: SBTItemData;          // Данные токена (роль, рейтинг и т.д.)
    contentUri: String;         // Ссылка на метаданные (JSON с именем, аватаркой)

    // Конструктор: вызывается при создании токена коллекцией
    init(id: Int, owner: Address, role: Int, contentUri: String, collection: Address) {
        self.id = id;
        self.data = SBTItemData{
            role: role,
            rating: 0,              // Новый токен начинается с рейтинга 0
            issuedAt: now(),        // Текущее время блокчейна
            active: true,           // Токен активен
            owner: owner,
            collectionAddr: collection
        };
        self.contentUri = contentUri;
    }

    // Обработчик установки рейтинга (только от коллекции)
    receive(msg: SetRating) {
        require(self.data.collectionAddr == sender(), "Only collection");
        self.data.rating = msg.rating;
        emit(RatingSet{id: self.id, newRating: msg.rating}.toCell());
    }

    // Обработчик сжигания токена (только от коллекции)
    receive(msg: BurnSBT) {
        require(self.data.collectionAddr == sender(), "Only collection");
        require(msg.index == self.id, "Wrong index");
        self.data.active = false;   // Помечаем токен как неактивный
        emit(SBTBurned{id: self.id}.toCell());
    }

    // Геттеры (view-функции для чтения данных)
    get fun getRole(): Int { return self.data.role; }
    get fun getRating(): Int { return self.data.rating; }
    get fun isActive(): Bool { return self.data.active; }
    get fun getOwner(): Address { return self.data.owner; }
    get fun getCollection(): Address { return self.data.collectionAddr; }
    get fun getItemData(): SBTItemData { return self.data; }
    get fun getContentUri(): String { return self.contentUri; }
}
