using System.Net.Http;
using System.Web.Http.OData.Builder;
//using System.Web.UI.WebControls;
using System.Web.Http.OData.Extensions;
using System.Web.Http.OData.Routing;
using System.Web.Http.Routing;
using iBemsDataService;
using iBemsDataService.Controllers;
using iBemsDataService.Model;
using Microsoft.Data.OData;
using Newtonsoft.Json;
using System;
//using System.Collections.Generic;
//using System.Linq;
using System.Net.Http.Formatting;
using System.Net.Http.Headers;
using System.Web.Http;

using System.Web.Http.OData;

using RouteParameter = System.Web.Http.RouteParameter;

namespace WebODataDataService
{
    public class BrowserJsonFormatter : JsonMediaTypeFormatter
    {
        public BrowserJsonFormatter()
        {
            this.SerializerSettings.Formatting = Formatting.Indented;
            this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
        }

        public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
        {
            base.SetDefaultContentHeaders(type, headers, mediaType);
            headers.ContentType = new MediaTypeHeaderValue("application/json");
        }
    }
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Formatters.Add(new BrowserJsonFormatter());
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApiWithAction",
                routeTemplate: "api/{controller}/{action}"
            );

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            //config.Routes.MapHttpRoute( "DefaultApiWithId" , "api/{controller}/{id}" , new { id = RouteParameter.Optional } , new { id = @"\d+" } );
            //config.Routes.MapHttpRoute( "DefaultApiWithAction" , "api/{controller}/{action}" );
            //config.Routes.MapHttpRoute( "DefaultApiGet" , "api/{controller}" , new { action = "Get" } , new { httpMethod = new HttpMethodConstraint( HttpMethod.Get ) } );
            //config.Routes.MapHttpRoute( "DefaultApiPost" , "api/{controller}" , new { action = "Post" } , new { httpMethod = new HttpMethodConstraint( HttpMethod.Post ) } );
            //config.Routes.MapHttpRoute(
            //    name: "DefaultApiWithAction" ,
            //    routeTemplate: "api/{controller}/{action}"
            //);

            //config.Routes.MapHttpRoute(
            //    name: "DefaultApi" ,
            //    routeTemplate: "api/{controller}/{id}" ,
            //    defaults: null
            //);

            var builder = new ODataConventionModelBuilder();

            builder.EntitySet<AvailableDueDateType>("AvailableDueDate");
            builder.EntitySet<Facility>("Facility");
            builder.EntitySet<TargetFacility>("CheckGroupTargetFacility");

            builder.EntitySet<CmFacility>("Facilities");
            builder.EntitySet<BemsMonitoringPoint>("BemsMonitoringPoint");
            builder.EntitySet<BemsServiceType>("BemsServiceType");
            builder.EntitySet<BemsFuelType>("BemsFuelType");
            builder.EntitySet<BemsFacilityType>("BemsFacilityType");

            builder.EntitySet<BemsFormulaBase>("BemsFormulaBase");
            builder.EntitySet<BemsFormula>("BemsFormula");
            builder.EntitySet<BemsReportFormat>("BemsReportFormat");
            builder.EntitySet<BemsReportHistory>("BemsReportHistory");
            builder.EntitySet<BemsFormulaParameter>("BemsFormulaParameter");
            builder.EntitySet<BemsFormulaTable>("BemsFormulaTable");
            builder.EntitySet<BemsFormulaTableValue>("BemsFormulaTableValue");

            builder.EntitySet<BemsFactorToe>("BemsFactorToe");
            builder.EntitySet<BemsFactorCo2>("BemsFactorCo2");

            builder.EntitySet<BemsMonitoringPointBaseData>("BemsMonitoringPointBaseData");
            builder.EntitySet<BemsMonitoringPointConfig>("BemsMonitoringPointConfig");
            builder.EntitySet<BemsMonitoringPointHistory15min>("BemsMonitoringPointHistory15min");
            builder.EntitySet<BemsMonitoringPointHistory15minRawData>("BemsMonitoringPointHistory15minRawData");
            builder.EntitySet<BemsMonitoringPointHistoryDaily>("BemsMonitoringPointHistoryDaily");
            builder.EntitySet<BemsMonitoringPointHistoryHourly>("BemsMonitoringPointHistoryHourly");
            builder.EntitySet<BemsMonitoringPointToAnlaysisType>("BemsMonitoringPointToAnlaysisType");
            //builder.EntitySet<BemsMonitoringPointToLocation>( "BemsMonitoringPointToLocation" );
            //            builder.EntitySet<BemsMonitoringPointToController>( "BemsMonitoringPointToController" );
            builder.EntitySet<BemsAnalysisType>("BemsAnalysisType");

            builder.EntitySet<BemsPriceType>("BemsPriceType");
            builder.EntitySet<BemsPriceMeta>("BemsPriceMeta");
            builder.EntitySet<BemsPriceCode>("BemsPriceCode");
            builder.EntitySet<BemsSitePrice>("BemsSitePrice");
            builder.EntitySet<BemsSitePriceHistory>("BemsSitePriceHistory");
            builder.EntitySet<BemsPriceFormula>("BemsPriceFormula");
            builder.EntitySet<BemsReportFormat>("BemsReportFormat");
            builder.EntitySet<BemsReportHistory>("BemsReportHistory");
            builder.EntitySet<BemsRentalRate>("BemsRentalRate");
            builder.EntitySet<BemsPeopleIncrease>("BemsPeopleIncrease");
            builder.EntitySet<BemsAlarmSetting>("BemsAlarmSetting");
            builder.EntitySet<BemsEnergyCost>("BemsEnergyCost");
            builder.EntitySet<BemsAlarmLog>("BemsAlarmLog");
            builder.EntitySet<BemsAlarmGroup>("BemsAlarmGroup");
            builder.EntitySet<BemsAlarmGroupUser>("BemsAlarmGroupUser");
            
            builder.EntitySet<BemsFloorPlan>("BemsFloorPlan");
            builder.EntitySet<BemsFloorStatus>("BemsFloorStatus");

            builder.EntitySet<CmHoliday>("CmHoliday");
            builder.EntitySet<CmHolidayCustom>("CmHolidayCustom");
            builder.EntitySet<CmHolidayWeekend>("CmHolidayWeekend");
            builder.EntitySet<CmBusinessField>("CmBusinessField");
            builder.EntitySet<CmSite>("CmSite");
            var entity = builder.EntitySet<CmFile>("CmFile");
            builder.EntitySet<CmFileCategory>("CmFileCategory");
            builder.EntitySet<CmBuilding>("CmBuilding");
            builder.EntitySet<CmFloor>("CmFloor");
            builder.EntitySet<CmZone>("CmZone");
            builder.EntitySet<CmUser>("CmUser");
            builder.EntitySet<CmUserToLicense>("CmUserToLicense");
            builder.EntitySet<CmCompany>("CmCompany");
            builder.EntitySet<CmDepartment>("CmDepartment");
            builder.EntitySet<CmCompanyType>("CmCompanyType");
            builder.EntitySet<CmPosition>("CmPosition");
            builder.EntitySet<CmUserGroup>("CmUserGroup");
            builder.EntitySet<CmUserGroupPermission>("CmUserGroupPermission");
            builder.EntitySet<CmFacilityFile>("CmFacilityFile");
            builder.EntitySet<FmsFacilityCheckItem>("FmsFacilityCheckItem");
            builder.EntitySet<FmsFacilityManual>("FmsFacilityManual");

            builder.EntitySet<FmsLicense>("FmsLicense");

            //builder.EntitySet<FmsWorkOperationItem>( "FmsWorkOperationItem" );
            //builder.EntitySet<FmsWorkOperationTime>( "FmsWorkOperationTime" );
            builder.EntitySet<FmsDrawingHistory>("FmsDrawingHistory");
            builder.EntitySet<FmsDrawingCodeType>("FmsDrawingCodeType");
            builder.EntitySet<FmsMaterialCodeAdjustmentType>("FmsMaterialCodeAdjustmentType");
            builder.EntitySet<FmsDrawing>("FmsDrawing");
            builder.EntitySet<FmsDrawingCodeGroup>("FmsDrawingCodeGroup");

            builder.EntitySet<FmsWorkSchedule>("FmsWorkSchedule");
            builder.EntitySet<FmsWorkScheduleToFacility>("FmsWorkScheduleToFacility");

            builder.EntitySet<FmsWorkResultLaw>("FmsWorkResultLaw");
            builder.EntitySet<FmsWorkResultFile>("FmsWorkResultFile");
            builder.EntitySet<FmsWorkResultCheckItem>("FmsWorkResultCheckItem");
            //builder.EntitySet<FmsWorkDailyRecordPrevention>( "FmsWorkDailyRecordPrevention" );
            //builder.EntitySet<FmsWorkDailyRecordWork>( "FmsWorkDailyRecordWork" );
            //builder.EntitySet<FmsWorkDailyRecord>( "FmsWorkDailyRecord" );
            //builder.EntitySet<FmsWorkDailyRecordTemplate>( "FmsWorkDailyRecordTemplate" );
            builder.EntitySet<FmsWorkCodeCauseClass>("FmsWorkCauseClass");
            builder.EntitySet<FmsWorkResult>("FmsWorkResult");
            builder.EntitySet<FmsWorkResultToFacility>("FmsWorkResultToFacility");
            builder.EntitySet<FmsWorkOrder>("FmsWorkOrder");
            builder.EntitySet<FmsWorkCodeProgress>("FmsWorkCodeProgress");
            builder.EntitySet<FmsWorkCodeType>("FmsWorkCodeType");

            builder.EntitySet<FmsWorkResultCheckItemMaterial>("FmsWorkResultCheckItemMaterial");

            builder.EntitySet<FmsWorkCodeEmergency>("FmsWorkCodeEmergency");
            builder.EntitySet<FmsWorkCodeCycleUnit>("FmsWorkCodeCycleUnit");
            builder.EntitySet<FmsWorkCodeHolidayWorkType>("FmsWorkCodeHolidayWorkType");
            builder.EntitySet<FmsWorkCodeLegalInspectionAgency>("FmsWorkCodeLegalInspectionAgency");
            builder.EntitySet<FmsFacilityCodeClass>("FmsFacilityClass");
            builder.EntitySet<FmsFacilityOperationItem>("FmsFacilityOperationItem");

            builder.EntitySet<FmsMaterial>("FmsMaterial");
            builder.EntitySet<FmsMaterialCarriedForward>("FmsMaterialCarriedForward");
            builder.EntitySet<FmsMaterialCodeClass>("FmsMaterialCodeClass");
            builder.EntitySet<FmsMaterialCodeLocation>("FmsMaterialCodeLocation");
            builder.EntitySet<FmsMaterialCodeProgress>("FmsMaterialCodeProgress");
            builder.EntitySet<FmsMaterialCodeType>("FmsMaterialCodeType");
            builder.EntitySet<FmsMaterialCodePurchaseType>("FmsMaterialCodePurchaseType");
            builder.EntitySet<FmsMaterialCodeReleaseType>("FmsMaterialCodeReleaseType");

            builder.EntitySet<FmsMaterialPurchaseOrder>("FmsMaterialPurchaseOrder");
            //            builder.EntitySet<FmsMaterialPurchaseOrderFile>( "FmsMaterialPurchaseOrderFile" );
            builder.EntitySet<FmsMaterialPurchaseOrderMaterial>("FmsMaterialPurchaseOrderMaterial");
            builder.EntitySet<FmsMaterialPurchaseRequest>("FmsMaterialPurchaseRequest");
            builder.EntitySet<FmsMaterialPurchaseRequestMaterial>("FmsMaterialPurchaseRequestMaterial");

            builder.EntitySet<FmsMaterialRelease>("FmsMaterialRelease");
            builder.EntitySet<FmsMaterialStored>("FmsMaterialStored");
            builder.EntitySet<FmsMaterialTradeCompany>("FmsMaterialTradeCompany");
            builder.EntitySet<FmsMaterialWarehouse>("FmsMaterialWarehouse");

            //builder.EntitySet<FmsWorkDailyRecordWorkingHour>( "FmsWorkDailyRecordWorkingHour" );
            //builder.EntitySet<FmsWorkOperationDate>( "FmsWorkOperationDate" );
            builder.EntitySet<FmsWorkOrderToFacility>("FmsWorkOrderToFacility");
            builder.EntitySet<FmsWorkRequest>("FmsWorkRequest");
            builder.EntitySet<FmsWorkRequestToFacility>("FmsWorkRequestToFacility");
            builder.EntitySet<MonitoringPointEx>("MonitoringPoint");


            builder.EntitySet<FmsConstruction>("FmsConstruction");
            builder.EntitySet<FmsConstructionEstimation>("FmsConstructionEstimation");
            builder.EntitySet<FmsConstructionCodeProgress>("FmsConstructionCodeProgress");
            builder.EntitySet<FmsConstructionCodeType>("FmsConstructionCodeType");
            builder.EntitySet<FmsCompanyEstimationCodeClass>("FmsCompanyEstimationCodeClass");
            builder.EntitySet<CmPartner>("CmPartner");
            builder.EntitySet<CmPartnerType>("CmPartnerType");

            builder.EntitySet<FmsAccidentCodeType>("FmsAccidentCodeType");
            builder.EntitySet<FmsAccident>("FmsAccident");

            builder.EntitySet<FmsEquipmentCodeType>("FmsEquipmentCodeType");
            builder.EntitySet<FmsEquipmentCodeStateType>("FmsEquipmentCodeStateType");
            builder.EntitySet<FmsEquipment>("FmsEquipment");
            builder.EntitySet<FmsEquipmentHistory>("FmsEquipmentHistory");
            builder.EntitySet<FmsEquipmentRentInfo>("FmsEquipmentRentInfo");
            builder.EntitySet<FmsEquipmentEx>("FmsEquipmentEx");

            builder.EntitySet<FmsBudgetDetailExecutionEx>("FmsBudgetDetailExecutionEx");

            builder.EntitySet<FmsContract>("FmsContract");
            builder.EntitySet<FmsContractClass>("FmsContractClass");
            builder.EntitySet<FmsContractMethod>("FmsContractMethod");
            builder.EntitySet<FmsContractType>("FmsContractType");
            builder.EntitySet<FmsPaymentType>("FmsPaymentType");

            builder.EntitySet<FmsManual>("FmsManual");
            builder.EntitySet<FmsManualType>("FmsManualType");
            builder.EntitySet<FmsManualHistory>("FmsManualHistory");

            builder.EntitySet<FmsMaterialEx>("FmsMaterialEx");
            builder.EntitySet<FmsMaterialPurchaseRequestEx>("FmsMaterialPurchaseRequestEx");
            builder.EntitySet<FmsMaterialStockHistoryDaily>("FmsMaterialStockHistoryDaily");
            builder.EntitySet<FmsMaterialStockHistoryMonthly>("FmsMaterialStockHistoryMonthly");
            builder.EntitySet<FmsMaterialStockHistoryAll>("FmsMaterialStockHistoryAll");

            builder.EntitySet<FmsBudgetCodeClass>("FmsBudgetCodeClass");
            builder.EntitySet<FmsBudget>("FmsBudget");
            builder.EntitySet<FmsBudgetDetail>("FmsBudgetDetail");
            builder.EntitySet<FmsBudgetDetailExecution>("FmsBudgetDetailExecution");

            builder.EntitySet<FmsBudgetDetailExecution2>("FmsBudgetDetailExecution2");

            builder.EntitySet<FmsBudgetCodeClassEx>("FmsBudgetCodeClassEx");

            builder.EntitySet<BemsControlPointHistory>("BemsControlPointHistory");
            builder.EntitySet<CmZoneTempHumiSet>("CmZoneTempHumiSet");
            builder.EntitySet<CmFacilityTempSet>("CmFacilityTempSet");
            builder.EntitySet<CmAlarmAdmin>("CmAlarmAdmin");
            builder.EntitySet<CmAnnouncement>("CmAnnouncement");
            builder.EntitySet<CmUserLoginHistory>("CmUserLoginHistory");
            builder.EntitySet<FmsDailyReport>("FmsDailyReport");
            builder.EntitySet<FmsFacilityOperationReport>("FmsFacilityOperationReport");
            //builder.EntitySet<FmsFacilityTaskReport>("FmsFacilityTaskReport");
            builder.EntitySet<FmsDailyCheckReport>("FmsDailyCheckReport");
            builder.EntitySet<FmsMonthlyReport>("FmsMonthlyReport");

            builder.EntitySet<FmsInvestmentCost>("FmsInvestmentCost");

            // 2016 02 10
            builder.EntitySet<CmPatrolType>("CmPatrolType");
            builder.EntitySet<CmPatrolGroup>("CmPatrolGroup");
            builder.EntitySet<CmPatrolGroupUser>("CmPatrolGroupUser");
            builder.EntitySet<CmPatrolPos>("CmPatrolPos");
            //2016 02 18
            builder.EntitySet<CmPatrolCourse>("CmPatrolCourse");
            builder.EntitySet<CmPatrolCoursePos>("CmPatrolCoursePos");
            builder.EntitySet<CmPatrolPlan>("CmPatrolPlan");
            builder.EntitySet<CmPatrolHistory>("CmPatrolHistory");
            builder.EntitySet<CmPatrolHistoryPos>("CmPatrolHistoryPos");
            builder.EntitySet<CmPatrolHistoryEx>("CmPatrolHistoryEx");
            builder.EntitySet<BemsEnergyConfigPercentMonth>("BemsEnergyConfigPercentMonth");
            builder.EntitySet<BemsEnergyConfigPercentWeek>("BemsEnergyConfigPercentWeek");
            builder.EntitySet<BemsEnergyDaily>("BemsEnergyDaily");
            builder.EntitySet<BemsEnergyDailyRegression>("BemsEnergyDailyRegression");
            //builder.EntitySet<BemsEnergyGoalDaily>("BemsEnergyGoalDaily");
            builder.EntitySet<BemsPeakHistoryDaily>("BemsPeakHistoryDaily");
            builder.EntitySet<BemsPeakHistory>("BemsPeakHistory");
            builder.EntitySet<BemsPeakInfo>("BemsPeakInfo");
            //2016 04 11
            builder.EntitySet<CmPatrolSchedule>("CmPatrolSchedule");

            //builder.EntitySet<BemsNoticePrice>("BemsNoticePrice");
            builder.EntitySet<BemsNoticePriceBase>("BemsNoticePriceBase");
            builder.EntitySet<BemsNoticePriceContractType>("BemsNoticePriceContractType");
            builder.EntitySet<BemsNoticePriceDetail>("BemsNoticePriceDetail");

            builder.EntitySet<BemsPeakFacility>("BemsPeakFacility");
            //2016 07 26
            builder.EntitySet<FmsReport>("FmsReport");
            //2018 01 19
            builder.EntitySet<CmMenu>("CmMenu");
            //2018 02 23
            builder.EntitySet<BemsChartInfo>("BemsChartInfo");
            builder.EntitySet<BemsControlAHUTempConfig>("BemsControlAHUTempConfig");
            var model = builder.GetEdmModel();
            config.Routes.MapODataRoute("odata", "odata", model);

            //builder = new ODataConventionModelBuilder();
            //builder.EntitySet<PointWithLocation>( "PointWithLocation" );
            //config.Routes.MapODataServiceRoute( "api" , "api" , builder.GetEdmModel() );
            //entity.EntityType.HasKey(  )
            //model.SetHasDefaultStream( );

        }
    }
}