#pragma once

#include <eosio/eosio.hpp>
#include <eosio/asset.hpp>
#include "../../entities/projects.hpp"
#include "../../entities/segments.hpp"

using namespace eosio;

namespace Capital::Core::Voting {

    /**
     * @brief Инициализирует голосование по проекту при его завершении
     * @param coopname Имя кооператива
     * @param project_id ID проекта
     */
    void initialize_project_voting(name coopname, uint64_t project_id);

    /**
     * @brief Рассчитывает все суммы для голосования по пулам
     */
    voting_amounts calculate_voting_amounts(const eosio::asset& authors_bonus_pool, 
                                           const eosio::asset& creators_bonus_pool,
                                           uint64_t total_author_shares,
                                           uint32_t total_voters,
                                           double authors_voting_percent = 38.2,
                                           double creators_voting_percent = 38.2);


    /**
     * @brief Рассчитывает итоговые суммы для участника по методу Водянова
     * @param coopname Имя кооператива
     * @param project_hash Хэш проекта
     * @param participant Имя участника
     * @return Итоговая сумма от голосования
     */
    eosio::asset calculate_voting_final_amount(name coopname, checksum256 project_hash, name participant);

    /**
     * @brief Рассчитывает равную премию автора
     * @param project Проект с данными голосования
     * @param segment Сегмент участника
     * @return Сумма равной премии автора
     */
    eosio::asset calculate_equal_author_bonus(const Capital::project& project, const Capital::Segments::segment& segment);

    /**
     * @brief Рассчитывает прямую премию создателя
     * @param project Проект с данными голосования
     * @param segment Сегмент участника
     * @return Сумма прямой премии создателя
     */
    eosio::asset calculate_direct_creator_bonus(const Capital::project& project, const Capital::Segments::segment& segment);

    /**
     * @brief Проверяет, завершено ли голосование
     * Досрочно: все проголосовали. По дедлайну: срок истек И хотя бы один проголосовал
     * @param project Проект с данными голосования
     * @return true если голосование завершено
     */
    bool is_voting_completed(const Capital::project& project);

    /**
     * @brief Обновляет статус голосования участника в зависимости от его ролей
     * @param coopname Имя кооператива
     * @param segment_id ID сегмента
     * @param project_id ID проекта
     */
    void update_voting_status(eosio::name coopname, uint64_t segment_id, uint64_t project_id);

} // namespace Capital::Core