%% Declaration of model variables
parameters  alpha p_beta_u zeta_p lambda_f delta p_gamma
            adp p_zeta Csi_ratio C_ratio h sigma_u sigma_r 
            zeta_w nu chi_wu Sdp kappa lambda_w rho_zeta
            Y_ss rho_B phi_T rho_r phi_pi phi_y p_zetaprime omega_u
            omega_r p_lnPi B_ratio rho_z rho_mu rho_vp rho_b
            sigma_B sigma_mu sigma_m sigma_b sigma_vp sigma_T sigma_zeta;

var mc rhk wh Kh Lh Yh X_pnu X_pnr X_pdu X_pdr Csi_u Csi_r pi uh Kbh Ih C_u
    C_r zetah rL r X_wnu X_wnr X_wdu X_wdr Bh BhL GS qh
    z mu b_u b_r vp_u vp_r lmbd eps_zeta;

varexo eps_B eps_m eps_mu eps_b_u eps_b_r eps_vp_u eps_vp_r eps_z eps_lmbd eps_T nu_zeta;

%% Calibration (median of prior distribution of parameters)
    alpha = 0.33;
    delta = 0.025;
    lambda_f = 1.45;
    lambda_w = 1.05;

    p_gamma = 20.4667;
    p_lnPi = 1.9585;
    p_beta_u = 0.9792;
    p_zeta = 0.001806*400;
    B_ratio = 0.9867;
    Sdp = 3.9170;
    adp = 0.1836;
    h = 0.6029;
    sigma_u = 1.8360;
    sigma_r = 1.8360;
    p_zetaprime = 1.2846;

    omega_u = 0.7334;
    omega_r = 1 - omega_u;

    Csi_ratio = 0.9180;
    C_ratio = 0.9180;
    chi_wu = 0.6143;
    nu = 1.9585;
    zeta_w = 0.5;
    zeta_p = 0.5;
    kappa = 0.00483;
    phi_T = 1.4448;

    rho_r = 0.7068;
    phi_pi = 1.7026;
    phi_y = 0.3672;

    rho_z = 0.3857;
    rho_zeta = 0.8135;
    rho_B = 0.8135;

    rho_mu = 0.7595;
    rho_b = 0.7595;
    rho_vp = 0.7595;

    sigma_B = 0.3686;
    sigma_mu = 0.3433;
    sigma_b = 0.3433;
    sigma_z = 0.3433;
    sigma_vp = 0.3433;
    sigma_m = 0.1700;
    sigma_lmbd = 0.3433;
    sigma_T = 0.3433;
    sigma_zeta = 0.1700;

%% Steady-state values
    Y_ss = 1;
% Model equations
model(linear);
    # gamma = p_gamma/400;
     #lnPi = p_lnPi/400;
     #beta_u = 1/(1+p_beta_u/400);
     #zeta = p_zeta/400;
     #beta_r = beta_u/(1+zeta);
     #zetaprime = p_zetaprime/100;

    # RL = (1+exp(gamma)*lnPi)/beta_r;
  // #RL = (exp(gamma)*exp(lnPi))/beta_r;
    # R = RL/(1+zeta);
     #betabar = (omega_u*beta_u*Csi_ratio + omega_r*beta_r)/(omega_u*Csi_ratio + omega_r);
     #rk = exp(gamma)/betabar - (1-delta);
     #KBAR = exp(gamma)*(alpha/(1+lambda_f))*(1/rk);
     #I_ss = (exp(gamma)-(1-delta))*(alpha/(1+lambda_f))*(1/rk);
     #C_r_ss = (1-I_ss)/(omega_u*C_ratio + omega_r);
     #C_u_ss = C_ratio * C_r_ss;

     #chi_pu = (omega_u)/(omega_u + omega_r * ((1-beta_u*zeta_p)/(1-beta_r*zeta_p)) * Csi_ratio^(-1));
     #qu = (betabar/beta_r - 1) * (1/zeta);
     #coef1 = (B_ratio)/(RL-kappa);
     #coef2 = ((1-exp(-gamma)*(exp(lnPi))^(-1)*kappa)*RL)/(RL-kappa);
     #coef3 = 1/(1+ (1+lambda_w)/lambda_w * (nu));

     #BL = (zeta)^(1/rho_zeta)*(RL-kappa);
     #B = BL/B_ratio;
     #GS_ss = -(1-beta_u^(-1))*B-( (1/(RL-kappa))-(RL/(RL-kappa))*(1/(exp(gamma)*exp(lnPi))) ) * BL;
     #L_ss = (alpha/(1+lambda_f))^(-alpha/(1-alpha)) * rk^(alpha/(1-alpha));

    z = rho_z * z(-1) + eps_z;
    mu = rho_mu * mu(-1) + eps_mu;
    b_u = rho_b * b_u(-1) + sigma_b * eps_b_u;
    b_r = rho_b * b_r(-1) + sigma_b * eps_b_r;
    vp_u = rho_vp * vp_u(-1) + sigma_vp * eps_vp_u;
    vp_r = rho_vp * vp_r(-1) + sigma_vp * eps_vp_r;
    lmbd = eps_lmbd;
    eps_zeta = rho_zeta * eps_zeta(-1) + nu_zeta;

    mc = alpha * rhk + (1-alpha) * wh;
    Kh = wh - rhk + Lh;
    Yh = alpha * Kh + (1-alpha) * Lh;
    X_pnu = (1-beta_u*zeta_p) * (Csi_u + Yh + mc + lmbd) + beta_u * zeta_p * ((1+lambda_f)/lambda_f * pi(+1) + X_pnu(+1));
    X_pnr = (1-beta_r*zeta_p) * (Csi_r + Yh + mc + lmbd) + beta_r * zeta_p * ((1+lambda_f)/lambda_f * pi(+1) + X_pnr(+1));
    X_pdu = (1-beta_u*zeta_p) * (Csi_u + Yh) + beta_u * zeta_p * ( pi(+1)/lambda_f + X_pdu(+1) );
    X_pdr = (1-beta_r*zeta_p) * (Csi_r + Yh) + beta_r * zeta_p * ( pi(+1)/lambda_f + X_pdr(+1) );
    pi = ((1-zeta_p)/zeta_p) * (chi_pu*(X_pnu-X_pdu) + (1-chi_pu)*(X_pnr-X_pdr));
    Kh = -z + uh + Kbh(-1);
    Kbh = (1-delta) * exp(-gamma) * (Kbh(-1)-z) + (1-(1-delta)*exp(-gamma)) * (Ih + mu);
    rhk*rk = adp*uh;
    qh = betabar * exp(-gamma) * (rk*rhk(+1) + (1-delta)*qh(+1)) - z(+1)
       + qu * ( ((1+zeta)/(1+qu*zeta)) * Csi_u(+1) - Csi_u)
       + (1-qu) * ( (1/(1+qu*zeta))    * Csi_r(+1) - Csi_r);
    0 = qh + mu - exp(2*gamma)*Sdp*(z+Ih-Ih(-1)) + betabar * exp(2*gamma) * Sdp * (z(+1) + Ih(+1) - Ih);
    Csi_u = (1/(1-beta_u*h)) * (b_u - beta_u*h*b_u(+1)) + (1/(1-beta_u*h)) * (-sigma_u/(1-h)) * ((1+beta_u*h^2)*C_u - beta_u*h*C_u(+1) - h*C_u(-1));
    Csi_r = (1/(1-beta_r*h)) * (b_r - beta_r*h*b_r(+1)) + (1/(1-beta_r*h)) * (-sigma_r/(1-h)) * ((1+beta_r*h^2)*C_r - beta_r*h*C_r(+1) - h*C_r(-1));
    Csi_u = r + Csi_u(+1) - z(+1) - pi(+1);
    zetah + Csi_u = (RL/(RL-kappa)) * rL + Csi_u(+1) - z(+1) - pi(+1) - (kappa/(RL-kappa)) * rL(+1);
            Csi_r = (RL/(RL-kappa)) * rL + Csi_r(+1) - z(+1) - pi(+1) - (kappa/(RL-kappa)) * rL(+1);
    X_wnu = (1-zeta_w*beta_u)*( b_u + vp_u + (1+nu)*Lh + (1+lambda_w)/lambda_w*(1+nu)*wh )
          + zeta_w * beta_u * ( (1+lambda_w)/lambda_w*(1+nu)*(pi(+1)+z(+1)) + X_wnu(+1));

    X_wnr = (1-zeta_w*beta_r)*( b_r + vp_r + (1+nu)*Lh + (1+lambda_w)/lambda_w*(1+nu)*wh )
          + zeta_w * beta_r * ( (1+lambda_w)/lambda_w*(1+nu)*(pi(+1)+z(+1)) + X_wnr(+1));

    X_wdu = (1-zeta_w*beta_u)*(Csi_u + Lh + ((1+lambda_w)/lambda_w)*wh)
          + zeta_w*beta_u * ((1/lambda_w)*(pi(+1) + z(+1)) + X_wdu(+1));

    X_wdr = (1-zeta_w*beta_r)*(Csi_r + Lh + ((1+lambda_w)/lambda_w)*wh)
          + zeta_w*beta_r * ((1/lambda_w)*(pi(+1) + z(+1)) + X_wdr(+1));

    wh = (1-zeta_w) * coef3 * (chi_wu * (X_wnu - X_wdu) + (1-chi_wu) * (X_wnr - X_wdr))
       + zeta_w * (wh(-1) - pi - z);

    Bh + coef1 * BhL  = (1/beta_u)*(Bh(-1)+r(-1)) + coef1 * (1/beta_r) * BhL(-1)
                      + coef2 * coef1 * rL - GS/B 
                      - ( (1/beta_u) + coef1 * (1/beta_r) ) * (z+pi);
    
    BhL - (RL/(RL-kappa)) * rL = rho_B * (BhL(-1) - (RL/(RL-kappa)) * rL(-1)) - eps_B; %%Choque negativo -> mesmo shape do paper
    GS/GS_ss = phi_T * (Bh(-1) + coef1 * BhL(-1) - (RL/(RL-kappa))* coef1 * rL(-1))/(1+coef1) + eps_T;
   // zetah = zetaprime * BhL -zetaprime* (RL/(RL-kappa)) * rL+ eps_zeta;
   zetah = zetaprime * BhL + eps_zeta;
    Yh = (omega_u*C_u_ss/Y_ss) * C_u + (omega_r*C_r_ss/Y_ss) * C_r + I_ss/Y_ss * Ih + (exp(-gamma)*rk*KBAR/Y_ss)*uh;
    
    r = rho_r * r(-1) + (1-rho_r) * (phi_pi * pi + phi_y * (Yh-Yh(-4)+z(-3)+z(-2)+z(-1)+z)) + eps_m;

end;

resid(1);
steady;
check;


shocks;
    var eps_B = sigma_B;
    var eps_m = sigma_m;
    var eps_vp_u = 1;
    var eps_vp_r = 1;
    var eps_lmbd = sigma_lmbd;
    var eps_b_u = 1;
    var eps_b_r = 1;
    var eps_T = sigma_T;
    var nu_zeta = sigma_zeta;
end;
stoch_simul(irf=31, relative_irf, periods=500, nograph);
