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

import {Script, console} from "forge-std/Script.sol";
import {VaultFactory} from "../../../contracts/vault/VaultFactory.sol";

/**
 * @title DeployAcVdcSdcVaults
 * @notice Single script to create all ac* / vdc* / sdc* vaults via VaultFactory.createVaultWithDecimals.
 * @dev Run after DeployVaultSystem. Uses same owner/entity and base token addresses per chain for consistency.
 *      See docs/runbooks/MULTI_CHAIN_EXECUTION_DETERMINISTIC_DEPLOYMENT.md (DepositToken/DebtToken).
 *
 * Env:
 *   PRIVATE_KEY          - Deployer (must have VAULT_DEPLOYER_ROLE on VaultFactory).
 *   VAULT_FACTORY_ADDRESS - VaultFactory contract address.
 *   OWNER                - (optional) Vault owner; default deployer.
 *   ENTITY               - (optional) Regulated entity; default deployer.
 *   CUSDC_ADDRESS_138    - (optional) Compliant USDC; if set, creates vault → acUSDC + vdcUSDC.
 *   CUSDT_ADDRESS_138    - (optional) Compliant USDT; if set, creates vault → acUSDT + vdcUSDT.
 *   COMPLIANT_USDC_ADDRESS, COMPLIANT_USDT_ADDRESS - Fallback env names if CUSDC/CUSDT_138 unset.
 *   cEURC_ADDRESS_138, cEURT_ADDRESS_138, cGBPC_ADDRESS_138, cGBPT_ADDRESS_138,
 *   cAUDC_ADDRESS_138, cJPYC_ADDRESS_138, cCHFC_ADDRESS_138, cCADC_ADDRESS_138,
 *   cXAUC_ADDRESS_138, cXAUT_ADDRESS_138 - Optional additional base tokens (6 decimals).
 */
contract DeployAcVdcSdcVaults is Script {
    uint8 constant DECIMALS = 6;
    bool constant DEBT_TRANSFERABLE = true;

    struct TokenSpec {
        string envPrimary;
        string envAlt;
        string label;
    }

    TokenSpec[] internal tokens;

    function _initTokens() internal {
        tokens.push(TokenSpec("CUSDC_ADDRESS_138", "COMPLIANT_USDC_ADDRESS", "USDC"));
        tokens.push(TokenSpec("CUSDT_ADDRESS_138", "COMPLIANT_USDT_ADDRESS", "USDT"));
        tokens.push(TokenSpec("cEURC_ADDRESS_138", "", "EURC"));
        tokens.push(TokenSpec("cEURT_ADDRESS_138", "", "EURT"));
        tokens.push(TokenSpec("cGBPC_ADDRESS_138", "", "GBPC"));
        tokens.push(TokenSpec("cGBPT_ADDRESS_138", "", "GBPT"));
        tokens.push(TokenSpec("cAUDC_ADDRESS_138", "", "AUDC"));
        tokens.push(TokenSpec("cJPYC_ADDRESS_138", "", "JPYC"));
        tokens.push(TokenSpec("cCHFC_ADDRESS_138", "", "CHFC"));
        tokens.push(TokenSpec("cCADC_ADDRESS_138", "", "CADC"));
        tokens.push(TokenSpec("cXAUC_ADDRESS_138", "", "XAUC"));
        tokens.push(TokenSpec("cXAUT_ADDRESS_138", "", "XAUT"));
    }

    function run() external {
        _initTokens();
        uint256 pk = vm.envUint("PRIVATE_KEY");
        address deployer = vm.addr(pk);
        address owner = vm.envOr("OWNER", deployer);
        address entity = vm.envOr("ENTITY", deployer);

        address factoryAddr = vm.envAddress("VAULT_FACTORY_ADDRESS");
        if (factoryAddr == address(0)) {
            factoryAddr = vm.envOr("VAULT_FACTORY", address(0));
        }
        require(factoryAddr != address(0), "VAULT_FACTORY_ADDRESS required");
        VaultFactory factory = VaultFactory(factoryAddr);

        vm.startBroadcast(pk);

        for (uint256 i = 0; i < tokens.length; i++) {
            address base = _getToken(tokens[i].envPrimary, tokens[i].envAlt);
            if (base == address(0)) continue;
            (address vault, address depositToken, address debtToken) = factory.createVaultWithDecimals(
                owner,
                entity,
                base,
                base,
                DECIMALS,
                DECIMALS,
                DEBT_TRANSFERABLE
            );
            console.log(string.concat(tokens[i].label, " vault:"), vault);
            console.log(string.concat("ac", tokens[i].label, " (deposit):"), depositToken);
            console.log(string.concat("vdc", tokens[i].label, " (debt):"), debtToken);
        }

        vm.stopBroadcast();
    }

    function _getToken(string memory primary, string memory altKey) internal view returns (address) {
        address a = vm.envOr(primary, address(0));
        if (a != address(0)) return a;
        return vm.envOr(altKey, address(0));
    }
}
