contract BAC is StandardToken{
    string public constant name = "BananaFundCoin";
    string public constant symbol = "BAC";
    uint public constant decimals = 18;
    string public version = "1.0";
    
    //1以太可以兑换代币数量
    uint public price ;
    uint public issueIndex = 0;
    //代币分配
    uint public constant bacFund =500*(10**6)*10**decimals;
    uint public constant MaxReleasedBac =1000*(10**6)*10**decimals;
    //判定是否在BAC兑换中
    bool public saleOrNot;
    //事件
    event InvalidCaller(address caller);
    event Issue(uint issueIndex, address addr, uint ethAmount, uint tokenAmount);
    event StartOK();
    event InvalidState(bytes msg);
    event ShowMsg(bytes msg);
    
    //定义为合约部署的部署钱包地址
    address public target;
    
    //合约转账地址   代币兑换价格 
    function BAC(uint _price){
        target = msg.sender;
        price =_price;
        totalSupply=bacFund;
        balances[target] = bacFund;
        saleOrNot = false;
    }
    
    modifier onlyOwner {
        if (target == msg.sender) {
          _;
        } else {
            InvalidCaller(msg.sender);
            throw;
        }
    }

    modifier inProgress {
        if (saleStarted()) {
            _;
        } else {
            InvalidState("Sale is not in progress");
            throw;
        }
    }
  
    //根据转入的以太币数额返币
    function () payable{
        if(saleOrNot){
            issueToken(msg.sender);
        }else{
            throw;
        }
    }
    
    function issueToken(address recipient) payable inProgress{
        assert(msg.value >= 0.01 ether);
        //计算可以获得代币的数量
        uint  amount = computeAccount(msg.value);
        if(totalSupply < bacFund+MaxReleasedBac){
            balances[recipient] = balances[recipient].add(amount);
            totalSupply = totalSupply.add(amount);
            Issue(issueIndex++, recipient,msg.value, amount);
        }else{
            InvalidState("BAC is not enough");
            throw;
        }
        //将以太转入发起者的钱包地址
        if (!target.send(msg.value)) {
            throw;
        }
    }
    
    //计算返回代币的数量
    function computeAccount(uint ehtAccount) internal constant returns (uint tokens){
        tokens=price.mul(ehtAccount);
    }
    
    //定义代币的兑换比列
    function setPrice(uint _price) onlyOwner{
        if(_price>0){
            price= _price;
        }else{
            ShowMsg("Invalid price");
        }
    }
    
    //开启代币的发售
    function startSale() onlyOwner{
        if(!saleOrNot){
            saleOrNot = true;
            StartOK();
        }else{
            ShowMsg("sale is ing ");
        }
    }   
    
    // 停止代币的发售
    function stopSale() onlyOwner{
        if(saleOrNot) {
            saleOrNot=false;
            //将剩余的不足的代币转入target
            if(totalSupply< 1500*(10**6)*10**decimals){
                balances[target] = balances[target].add(1500*(10**6)*10**decimals-totalSupply);
            }
        }else{
            ShowMsg("sale has been over");
        }
    }
    
    function saleStarted() constant returns (bool) {
        return saleOrNot;
    }
    
    //自杀
    function destroy() onlyOwner{
        suicide(target);
    }
}
function startSale() onlyOwner{
    if(!saleOrNot){
        saleOrNot = true;
        StartOK();
    }else{
        ShowMsg("sale is ing ");
    }
}   

//开启代币的发售