// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "forge-std/Script.sol";
import "../../contracts/vault/Ledger.sol";
import "../../contracts/vault/RegulatedEntityRegistry.sol";
import "../../contracts/vault/XAUOracle.sol";
import "../../contracts/vault/RateAccrual.sol";
import "../../contracts/vault/adapters/CollateralAdapter.sol";
import "../../contracts/vault/adapters/eMoneyJoin.sol";
import "../../contracts/vault/VaultFactory.sol";
import "../../contracts/vault/Vault.sol";
import "../../contracts/vault/tokens/DepositToken.sol";
import "../../contracts/vault/tokens/DebtToken.sol";

/**
 * @title DeployVaultSystem
 * @notice Deployment script for the complete Vault System
 */
contract DeployVaultSystem is Script {
    function run() external {
        uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
        address admin = vm.addr(deployerPrivateKey);

        vm.startBroadcast(deployerPrivateKey);

        console.log("Deploying Vault System...");
        console.log("Admin:", admin);

        // 1. Deploy Regulated Entity Registry
        console.log("\n1. Deploying RegulatedEntityRegistry...");
        RegulatedEntityRegistry entityRegistry = new RegulatedEntityRegistry(admin);
        console.log("RegulatedEntityRegistry:", address(entityRegistry));

        // 2. Deploy XAU Oracle (requires existing price feed)
        console.log("\n2. Deploying XAUOracle...");
        XAUOracle xauOracle = new XAUOracle(admin);
        console.log("XAUOracle:", address(xauOracle));

        // Note: Price feeds must be added separately after deployment

        // 3. Deploy Rate Accrual
        console.log("\n3. Deploying RateAccrual...");
        RateAccrual rateAccrual = new RateAccrual(admin);
        console.log("RateAccrual:", address(rateAccrual));

        // 4. Deploy Ledger
        console.log("\n4. Deploying Ledger...");
        Ledger ledger = new Ledger(admin, address(xauOracle), address(rateAccrual));
        console.log("Ledger:", address(ledger));

        // 5. Deploy Collateral Adapter
        console.log("\n5. Deploying CollateralAdapter...");
        CollateralAdapter collateralAdapter = new CollateralAdapter(admin, address(ledger));
        console.log("CollateralAdapter:", address(collateralAdapter));

        // Grant vault role to collateral adapter
        ledger.grantVaultRole(address(collateralAdapter));

        // 6. Deploy eMoney Join Adapter
        console.log("\n6. Deploying eMoneyJoin...");
        eMoneyJoin eMoneyJoinAdapter = new eMoneyJoin(admin);
        console.log("eMoneyJoin:", address(eMoneyJoinAdapter));

        // Grant vault role to eMoney join
        ledger.grantVaultRole(address(eMoneyJoinAdapter));

        // 7. Deploy Token Implementations (for UUPS proxies)
        console.log("\n7. Deploying Token Implementations...");
        DepositToken depositTokenImpl = new DepositToken();
        DebtToken debtTokenImpl = new DebtToken();
        console.log("DepositToken Implementation:", address(depositTokenImpl));
        console.log("DebtToken Implementation:", address(debtTokenImpl));

        // 8. Deploy Vault Implementation (if using proxy pattern)
        console.log("\n8. Deploying Vault Implementation...");
        Vault vaultImpl = new Vault(
            address(0), // Placeholder
            address(0), // Placeholder
            address(ledger),
            address(entityRegistry),
            address(collateralAdapter),
            address(eMoneyJoinAdapter)
        );
        console.log("Vault Implementation:", address(vaultImpl));

        // 9. Deploy Vault Factory
        console.log("\n9. Deploying VaultFactory...");
        VaultFactory vaultFactory = new VaultFactory(
            admin,
            address(vaultImpl),
            address(depositTokenImpl),
            address(debtTokenImpl),
            address(ledger),
            address(entityRegistry),
            address(collateralAdapter),
            address(eMoneyJoinAdapter)
        );
        console.log("VaultFactory:", address(vaultFactory));

        // 10. Configure initial settings
        console.log("\n10. Configuring initial settings...");

        // Set risk parameters for ETH (M0 collateral)
        address eth = address(0);
        ledger.setRiskParameters(
            eth,
            1_000_000e18, // debt ceiling: 1M ETH
            11000, // liquidation ratio: 110%
            50000 // credit multiplier: 5x
        );
        console.log("Configured ETH risk parameters");

        // Approve ETH in collateral adapter
        collateralAdapter.approveAsset(eth);
        console.log("Approved ETH in CollateralAdapter");

        vm.stopBroadcast();

        console.log("\n=== Deployment Complete ===");
        console.log("EntityRegistry:", address(entityRegistry));
        console.log("XAUOracle:", address(xauOracle));
        console.log("RateAccrual:", address(rateAccrual));
        console.log("Ledger:", address(ledger));
        console.log("CollateralAdapter:", address(collateralAdapter));
        console.log("eMoneyJoin:", address(eMoneyJoinAdapter));
        console.log("VaultFactory:", address(vaultFactory));
        console.log("\nNext Steps:");
        console.log("1. Add price feeds to XAUOracle");
        console.log("2. Register entities in RegulatedEntityRegistry");
        console.log("3. Approve currencies in eMoneyJoin");
        console.log("4. Create vaults via VaultFactory");
    }
}
