// określamy wersję Solidity, z której korzystamy
pragma solidity ^0.4.23;

// definicja kontraktu
contract ITshape {

    // definiujemy strukturę szkolenia
    struct Training {

        // true jeżeli profesjonalista ukończył szkolenie
        bool completed;

        // opis szkolenia
        string description;
    }

    // adres właściciela kontraktu
    address public owner;

    // słownik klucz–wartość, gdzie kluczem jest wartość funkcji skrótu
    // obliczonej na podstawie imienia i nazwiska profesjonalisty
    // wartość stanowi instancja struktury opisującej szkolenie
    mapping(bytes32 => Training) private professionals;

    // konstruktor kontraktu – wołany tylko raz
    // zapisuje adres właściciela (adres konta, z którego został wdrożony)
    constructor() public {
        owner = msg.sender;
    }

    // funkcja pozwalająca dodać profesjonalistę do blockchain
    // przyjmuje imię i nazwisko uczestnika oraz opis szkolenia
    function addProfessional(string name, string trainingDescription) public {

        // tylko właściciel może dodać profesjonalistę
        require(msg.sender == owner);

        // właściciel musi określić nazwę uczestnika
        require(bytes(name).length > 0);

        // tworzymy w pamięci instancję szkolenia
        Training memory training = Training({
            completed : true,
            description : trainingDescription
            });

        // obliczamy funkcję skrótu oraz przypisujemy utworzoną instancję
        professionals[sha256(name)] = training;
    }

    // funkcja umożliwiająca weryfikację profesjonalisty
    function verify(string name) public view returns (bool, string) {

        // musimy określić nazwę uczestnika
        require(bytes(name).length > 0);

        // pobieramy instancję szkolenia z blockchain
        // jeżeli nie istnieje otrzymamy wartości domyślne
        Training storage training = professionals[sha256(name)];

        // zwracamy informację o uczestnictwie w szkoleniu wraz z jego opisem
        return (training.completed, training.description);
    }
}