// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.24;

import "./DAO.sol";
import "./WorkContract.sol";
import "./IOnValidate.sol";

contract Onboarding is WorkContract, IOnValidate {
    constructor(DAO dao_, uint price_) WorkContract(dao_, price_) {}

    /// Accept work approval/disapproval from customer
    function submitWorkApproval(
        uint requestIndex,
        bool approval
    ) external override {
        WorkRequest storage request = requests[requestIndex];
        require(
            request.status == WorkStatus.EvidenceSubmitted,
            "Status must be EvidenceSubmitted"
        );
        AvailabilityStake storage stake = stakes[request.stakeIndex];
        request.status = WorkStatus.ApprovalSubmitted;
        request.approval = approval;
        // Make work evidence post
        uint postIndex = dao.addPost(stake.worker, request.evidenceContentId);
        emit WorkApprovalSubmitted(requestIndex, approval);
        // Initiate validation pool
        uint poolIndex = dao.initiateValidationPool{
            value: request.fee - request.fee / 10
        }(postIndex, POOL_DURATION, true, abi.encode(requestIndex));
        dao.stake(poolIndex, stake.amount, true);
    }

    /// Callback to be executed when review pool completes
    function onValidate(bool votePasses, bytes calldata callbackData) external {
        require(
            msg.sender == address(dao),
            "onValidate may only be called by the DAO contract"
        );
        uint requestIndex = abi.decode(callbackData, (uint));
        WorkRequest storage request = requests[requestIndex];
        if (!votePasses) {
            // refund the customer the remaining amount
            payable(request.customer).transfer(request.fee / 10);
            return;
        }
        uint postIndex = dao.addPost(
            request.customer,
            request.requestContentId
        );
        dao.initiateValidationPool{value: request.fee / 10}(
            postIndex,
            POOL_DURATION,
            false,
            ""
        );
    }
}