package serializer;

import shape.Circle;
import shape.Rectangle;
import shape.Shape;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ShapeWriter implements ShapeVisitor {

    private PrintWriter printWriter;
    private static final Map<Class<? extends Shape>, ShapeSerializer<? extends Shape>> serializers = new HashMap<>();

    static {
        serializers.put(Circle.class, new CircleSerializer());
        serializers.put(Rectangle.class, new RectangleSerializer());
    }


    public ShapeWriter(PrintWriter printWriter) {
        this.printWriter = printWriter;
    }

    public static void write (File file, Iterable<Shape> shapes) throws IOException {
        try(PrintWriter printWriter = new PrintWriter(file)){
        ShapeWriter shapeWriter = new ShapeWriter(printWriter);

        for (Shape shape : shapes) {
            shape.accept(shapeWriter);
        }
        }
    }

    @Override
    public void visit(Circle circle) {
        ShapeSerializer<Circle> serializer = (ShapeSerializer<Circle>) serializers.get(Circle.class);
        if (serializer != null) {
            String serializedData = serializer.serialize(circle);
            printWriter.println(serializedData);
        } else {
            throw new IllegalArgumentException("No serializer found for Circle");
        }
    }

    @Override
    public void visit(Rectangle rectangle) {
        ShapeSerializer<Rectangle> serializer = (ShapeSerializer<Rectangle>) serializers.get(Rectangle.class);
        if (serializer != null) {
            String serializedData = serializer.serialize(rectangle);
            printWriter.println(serializedData);
        } else {
            throw new IllegalArgumentException("No serializer found for Rectangle");
        }
    }
}