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

import {Script, console} from "forge-std/Script.sol";
import {ISO4217WToken} from "../../contracts/iso4217w/ISO4217WToken.sol";
import {ComplianceGuard} from "../../contracts/iso4217w/ComplianceGuard.sol";
import {ReserveOracle} from "../../contracts/iso4217w/oracle/ReserveOracle.sol";
import {MintController} from "../../contracts/iso4217w/controllers/MintController.sol";
import {BurnController} from "../../contracts/iso4217w/controllers/BurnController.sol";
import {TokenRegistry} from "../../contracts/iso4217w/registry/TokenRegistry.sol";
import {TokenFactory} from "../../contracts/iso4217w/TokenFactory.sol";

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

        vm.startBroadcast(deployerPrivateKey);

        console.log("Deploying ISO-4217 W Token System...");
        console.log("Admin:", admin);

        // 1. Deploy Compliance Guard
        console.log("\n1. Deploying ComplianceGuard...");
        ComplianceGuard complianceGuard = new ComplianceGuard(admin);
        console.log("ComplianceGuard:", address(complianceGuard));

        // 2. Deploy Reserve Oracle
        console.log("\n2. Deploying ReserveOracle...");
        ReserveOracle reserveOracle = new ReserveOracle(admin, 3600, 3); // 1 hour staleness, 3 oracles
        console.log("ReserveOracle:", address(reserveOracle));

        // 3. Deploy Mint Controller
        console.log("\n3. Deploying MintController...");
        MintController mintController = new MintController(
            admin,
            address(reserveOracle),
            address(complianceGuard)
        );
        console.log("MintController:", address(mintController));

        // 4. Deploy Burn Controller
        console.log("\n4. Deploying BurnController...");
        BurnController burnController = new BurnController(admin);
        console.log("BurnController:", address(burnController));

        // 5. Deploy Token Registry
        console.log("\n5. Deploying TokenRegistry...");
        TokenRegistry tokenRegistry = new TokenRegistry(admin);
        console.log("TokenRegistry:", address(tokenRegistry));

        // 6. Deploy Token Implementation (for UUPS proxies)
        console.log("\n6. Deploying Token Implementation...");
        ISO4217WToken tokenImpl = new ISO4217WToken();
        console.log("ISO4217WToken Implementation:", address(tokenImpl));

        // 7. Deploy Token Factory
        console.log("\n7. Deploying TokenFactory...");
        TokenFactory tokenFactory = new TokenFactory(
            admin,
            address(tokenImpl),
            address(tokenRegistry),
            address(complianceGuard),
            address(reserveOracle),
            address(mintController),
            address(burnController)
        );
        console.log("TokenFactory:", address(tokenFactory));

        vm.stopBroadcast();

        console.log("\n=== Deployment Complete ===");
        console.log("ComplianceGuard:", address(complianceGuard));
        console.log("ReserveOracle:", address(reserveOracle));
        console.log("MintController:", address(mintController));
        console.log("BurnController:", address(burnController));
        console.log("TokenRegistry:", address(tokenRegistry));
        console.log("TokenFactory:", address(tokenFactory));
        console.log("\nNext Steps:");
        console.log("1. Add oracles to ReserveOracle");
        console.log("2. Configure custodian addresses");
        console.log("3. Deploy W tokens via TokenFactory (e.g., USDW, EURW, GBPW)");
    }
}
