package example;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;

@Intercepts({
    @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}),
    @Signature(type = StatementHandler.class, method = "parameterize", args = {Statement.class}),
    @Signature(type = StatementHandler.class, method = "query",
            args = {Statement.class, org.apache.ibatis.session.ResultHandler.class}),
    @Signature(type = ParameterHandler.class, method = "setParameters", args = {PreparedStatement.class}),
    @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})
})
public final class TracePlugin implements Interceptor {
    private final List<String> calls = new ArrayList<>();
    @Override public Object intercept(Invocation invocation) throws Throwable {
        calls.add(invocation.getMethod().getName());
        return invocation.proceed();
    }
    public List<String> calls() { return List.copyOf(calls); }
    public void clear() { calls.clear(); }
}
