package netflix.adminresources.pages;
 
import com.google.inject.Inject; 
import com.google.inject.Singleton; 
import com.sun.jersey.api.view.Viewable; 
import netflix.admin.AdminConfigImpl; 
import netflix.admin.AdminContainerConfig; 
import netflix.adminresources.AdminPageInfo; 
import netflix.adminresources.AdminPageRegistry; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
 
import javax.annotation.PostConstruct; 
import javax.ws.rs.*; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 
import java.util.Collection; 
import java.util.HashMap; 
import java.util.Map; 
 
@Path("/"
@Produces(MediaType.TEXT_HTML) 
@Singleton 
public class AdminPageResource { 
    private static final Logger LOG = LoggerFactory.getLogger(AdminPageResource.class); 
 
    @Inject(optional = true
    private AdminContainerConfig adminContainerConfig; 
 
    @Inject(optional = true
    private AdminPageRegistry adminPageRegistry; 
 
    @PostConstruct 
    public void init() { 
        if (adminPageRegistry == null) { 
            adminPageRegistry = new AdminPageRegistry(); 
        } 
        if (adminContainerConfig == null) { 
            adminContainerConfig = new AdminConfigImpl(); 
        } 
    } 
 
    @GET() 
    public Viewable showIndex() { 
        Map<String, Object> model = new HashMap<String, Object>(); 
        model.put("ajax_base", adminContainerConfig.ajaxDataResourceContext()); 
        model.put("template_base", adminContainerConfig.templateResourceContext()); 
 
        if (adminPageRegistry != null) { 
            final Collection<AdminPageInfo> adminPages = adminPageRegistry.getAllPages(); 
            model.put("adminPages", adminPages); 
        } 
 
        return new Viewable("/webadmin/home.ftl", model); 
    } 
 
    @GET 
    @Path("/{view}"
    public Viewable showViewIndex
            @PathParam("view") String view, 
            @QueryParam("id") @DefaultValue("") String id 
    ) { 
        LOG.info(view); 
        Map<String, Object> model = new HashMap<String, Object>(); 
        model.put("id", id); 
        model.put("ajax_base", adminContainerConfig.ajaxDataResourceContext()); 
        model.put("template_base", adminContainerConfig.templateResourceContext()); 
 
        if (adminPageRegistry != null && adminPageRegistry.getPageInfo(view) != null) { 
            final Map<String, Object> pageDataModel = adminPageRegistry.getPageInfo(view).getDataModel(); 
            if (pageDataModel != null) { 
                model.putAll(pageDataModel); 
            } 
            return new Viewable(adminPageRegistry.getPageInfo(view).getPageTemplate(), model); 
        } 
        throw new WebApplicationException(Response.Status.NOT_FOUND); 
    } 
 
    @POST 
    @Path("/{view}"
    public Viewable createObject
            @PathParam("view") String view, 
            @QueryParam("id") @DefaultValue("") String id 
    ) { 
        LOG.info(view); 
        Map<String, Object> model = new HashMap<String, Object>(); 
        model.put("id", id); 
        return new Viewable("/webadmin/" + view + "/create.ftl", model); 
    } 
 
    @GET 
    @Path("/jmx/mbean"
    public Viewable showJMXMbean(@QueryParam("id") String id, @QueryParam("key") String key) { 
        LOG.info(""); 
        Map<String, Object> model = new HashMap<String, Object>(); 
        model.put("id", id); 
        model.put("key", key); 
        model.put("ajax_base", adminContainerConfig.ajaxDataResourceContext()); 
 
        return new Viewable("/webadmin/jmx/view.ftl", model); 
    } 
}