/** Copyright (C) Conformiq Software Oy, Ltd.
 * All rights reserved.
 *
 * Created Wed Aug 27 16:48:45 2008.
 *
 * @file
 *
 * @author Tommi Vainikainen
 *
 *
 */
package com.conformiq.adaptation.ttcn;

import com.conformiq.qtronic2.QMLArray;
import com.conformiq.qtronic2.QMLBoolean;
import com.conformiq.qtronic2.QMLNumber;
import com.conformiq.qtronic2.QMLOptional;
import com.conformiq.qtronic2.QMLRecord;
import com.conformiq.qtronic2.QMLRecordField;
import com.conformiq.qtronic2.QMLString;
import com.conformiq.qtronic2.QMLValue;
import com.conformiq.qtronic2.QMLValueVisitor;

import java.math.BigDecimal;

public class TemplateDumper implements QMLValueVisitor {
    private PrettyPrinter out;

    public TemplateDumper(PrettyPrinter out) {
        this.out = out;
    }

    @Override
    public void visit(QMLRecord r) {
        if (r == null) {
            out.print("{ /* null record */ }");
            return;
        }

        out.print("{");
        out.endl();
        out.print("    ");
        out.block();
        for (int i = 0; i < r.getNumberOfFields(); i++) {
            if (i > 0) {
                out.print(",");
                out.endl();
            }
            QMLRecordField f = r.getField(i);
            out.print(TTCNScripter.makeValidTTCN3Identifier(f.getName()));
            out.print(" := ");
            QMLValue v = f.getValue();
            if (v != null)
                v.accept(this);
            else
                out.print("{ /* NULL */ }");
        }

        out.endl();
        out.resume();
        out.print("}");
    }

    @Override
    public void visit(QMLString x) {
        assert (x != null);
        String v = x.getValue();
        out.print("\"");
        for (int i = 0; i < v.length(); i++) {
            switch (v.charAt(i)) {
            case '\n':
                out.print("\\n");
                break;
            case '\r':
                out.print("\\r");
                break;
            case '\t':
                out.print("\\t");
                break;
            case '\"':
            case '\\':
                out.print("\\");
                // PASS THROUGH
            default:
                out.print(v.charAt(i));
                break;
            }
        }
        out.print("\"");
    }

    @Override
    public void visit(QMLBoolean x) {
        assert (x != null);
        out.print((x.getValue() ? "true" : "false"));
    }

    @Override
    public void visit(QMLNumber x) {
        assert (x != null);
        if (x.isBigInteger())
        {
            out.print(x.getBigInteger());
        }
        else
        {
            BigDecimal num = new BigDecimal(x.getNumerator()).setScale(20);
            BigDecimal den = new BigDecimal(x.getDenominator());
            out.print(num.divide(den, BigDecimal.ROUND_UP));
        }
    }

    @Override
    public void visit(QMLArray array) {
        if (array == null) {
            out.print("{ /* null */ }");
            return;
        }

        out.print("{");
        out.endl();
        out.print("    ");
        out.block();
        for (int i = 0; i < array.getNumberOfElements(); i++) {
            if (i > 0) {
                out.print(",");
                out.endl();
            }
            QMLValue v = array.getValue(i);
            if (v != null)
                v.accept(this);
            else
                out.print("{ /* null */ }");
        }

        out.endl();
        out.resume();
        out.print("}");
    }

    @Override
    public void visit(QMLOptional o) {
        QMLValue v = o.getValue();
        if (v == null) {
            out.print("omit");
        } else {
            v.accept(this);
        }
    }
}
