import java.io.*;
import java.net.*;

class AstaOneServer extends Thread {

    private Socket socket;
    private ObjectOutput out;
    private ObjectInput in;
    private MiglioreOfferta miglioreOfferta;

    public AstaOneServer(Socket s, MiglioreOfferta mo)
           throws IOException {
        socket = s;
        in = new ObjectInputStream(socket.getInputStream());
        out = new ObjectOutputStream(socket.getOutputStream());
        miglioreOfferta = mo;
        start();
    }

    public void run() {
        try {
            while (true) {
                String str = (String)in.readObject();
                if (str.equals("END"))
                    break;
                else if (str.equals("ASK"))
                    out.writeObject((miglioreOfferta.getMiglioreOfferta()));
                else if (str.equals("OFFERTA")) {
                    try {
                        Offerta nuova = (Offerta)in.readObject();
                        if (miglioreOfferta.migliore(nuova)) {
                            System.out.println("Migliore offerta: " + nuova);
                            out.writeObject("accettata");
                        }
                        else
                            out.writeObject("rifiutata");
                    }
                    catch (Exception err) {
                        System.out.println("Errore: " + err);
                    }
                }
            }
            System.out.println("closing...");
        } catch(Exception e) {
            System.err.println("Errore: " + e);
        } finally {
            try {
                socket.close();
            } catch(IOException e) {
                System.err.println("Socket not closed");
            }
        }
    }

}


public class ServerAsta {

    public static InetAddress IP;
    public static final int PORT = 2001;
    private static MiglioreOfferta miglioreOfferta;

    static {
        try {
            IP = InetAddress.getLocalHost();
            System.out.println("Address: " + IP);
            System.out.flush();
        }
        catch (Exception err) {
            System.out.println("Errore: " + err);
            System.out.flush();
        }
    }

    public static void main(String[] args)
           throws IOException {
        ServerSocket s = new ServerSocket(PORT);
        miglioreOfferta = new MiglioreOfferta(
                              new Offerta("Asta",10));
        System.out.println("Server Asta Started");
        try {
            while(true) {
                Socket socket = s.accept();
                System.out.println("Accettato socket " + socket);
                System.out.flush();
                try {
                    new AstaOneServer(socket, miglioreOfferta);
                } catch(IOException e) {
                    socket.close();
                }
            }
        } finally {
            s.close();
        }
    }

}
