package models

type OrderInfo struct {
	Orderheaderid      int     `json:"orderheaderid"`
	Applocationid      int     `json:"applocationid"`
	Applocation        string  `json:"applocation"`
	Tenantid           int     `json:"tenantid"`
	Partnerid          int     `json:"partnerid"`
	Locationid         int     `json:"locationid"`
	Categoryid         int     `json:"categoryid"`
	Subcategoryid      int     `json:"subcategoryid"`
	Moduleid           int     `json:"moduleid"`
	Configid           int     `json:"configid"`
	Orderid            string  `json:"orderid"`
	Orderdate          string  `json:"orderdate"`
	Deliverydate       string  `json:"deliverydate"`
	Orderstatus        string  `json:"orderstatus"`
	Deliverystatus     string  `json:"deliverystatus"`
	Deliveryamt        float64 `json:"deliveryamt"`
	Itemcount          int     `json:"itemcount"`
	Ordernotes         string  `json:"ordernotes"`
	Kms                string  `json:"kms"`
	Actualkms          string  `json:"actualkms"`
	Pending            string  `json:"Pending"`
	Processing         string  `json:"processing"`
	Ready              string  `json:"ready"`
	Cancelled          string  `json:"cancelled"`
	Delivered          string  `json:"delivered"`
	Assigntime         string  `json:"assigntime"`
	Starttime          string  `json:"starttime"`
	Arrivaltime        string  `json:"arrivaltime"`
	Pickuptime         string  `json:"pickuptime"`
	Deliverytime       string  `json:"deliverytime"`
	Canceltime         string  `json:"canceltime"`
	Deliverycharge     float64 `json:"deliverycharge"`
	Orderamount        float64 `json:"orderamount"`
	Customerid         int     `json:"customerid"`
	Pickupcustomer     string  `json:"pickupcustomer"`
	Pickupcontactno    string  `json:"pickupcontactno"`
	Pickuplocationid   int     `json:"pickuplocationid"`
	Pickupaddress      string  `json:"pickupaddress"`
	Pickupsuburb       string  `json:"pickupsuburb"`
	Pickupcity         string  `json:"pickupcity"`
	Pickuplat          string  `json:"pickuplat"`
	Pickuplong         string  `json:"pickuplong"`
	Pickupslot         string  `json:"pickupslot"`
	Deliveryid         int     `json:"deliveryid"`
	Deliverycustomerid int     `json:"deliverycustomerid"`
	Deliverycustomer   string  `json:"deliverycustomer"`
	Deliverycontactno  string  `json:"deliverycontactno"`
	Deliverylocationid int     `json:"deliverylocationid"`
	Deliveryaddress    string  `json:"deliveryaddress"`
	Deliverysuburb     string  `json:"deliverysuburb"`
	Droplat            string  `json:"droplat"`
	Droplon            string  `json:"droplon"`
	Deliverylat        string  `json:"deliverylat"`
	Deliverylong       string  `json:"deliverylong"`
	Deliverytype       string  `json:"deliverytype"`
	Paymenttype        int     `json:"paymenttype"`
	Tenantname         string  `json:"tenantname"`
	Tenanttoken        string  `json:"tenanttoken"`
	Tenantsuburb       string  `json:"tenantsuburb"`
	Tenantcity         string  `json:"tenantcity"`
	Tenantcontactno    string  `json:"tenantcontactno"`
	Tenantpostcode     string  `json:"tenantpostcode"`
	Tenantaddress      string  `json:"tenantaddress"`
	Locationname       string  `json:"locationname"`
	Locationsuburb     string  `json:"locationsuburb"`
	Locationcity       string  `json:"locationcity"`
	Locationcontactno  string  `json:"locationcontactno"`
	Locationaddress    string  `json:"locationaddress"`
	Rider              string  `json:"rider"`
	Ridercontactno     string  `json:"ridercontactno"`
	Riderkms           string  `json:"riderkms"`
	Smsdelivery        int     `json:"smsdelivery"`
	Customertoken      string  `json:"customertoken"`
	Ridertoken         string  `json:"ridertoken"`
	Previouskms        int     `json:"previouskms" gorm:"default:0"`
	Cumulativekms      int     `json:"cumulativekms" gorm:"default:0"`
	Step               int     `json:"step" gorm:"default:0"`
	Eta                string  `json:"eta" gorm:"type:varchar(100);default:''"`
	Quantity           int     `json:"quantity" gorm:"default:0"`
	Collectionamt      float64 `json:"collectionamt" gorm:"default:0"`
	Slab               string  `json:"slab"`
	Pricingdate        string  `json:"pricingdate"`
	Baseprice          float64 `json:"baseprice"`
	Minkm              int     `json:"minkm"`
	Priceperkm         float64 `json:"priceperkm"`
	Maxkm              int     `json:"maxkm"`
	Orders             int     `json:"orders"`
	Othercharges       float64 `json:"othercharges"`
	Surgecharges       float64 `json:"surgecharges"`
}

// type TenantOrders struct {
// 	Orderheaderid   int    `json:"orderheaderid"`
// 	Tenantid        int    `json:"tenantid"`
// 	Locationid      int    `json:"locationid"`
// 	Categoryid      int    `json:"categoryid"`
// 	Subcategoryid   int    `json:"subcategoryid"`
// 	Moduleid        int    `json:"moduleid"`
// 	Configid        int    `json:"configid"`
// 	Orderid         string `json:"orderid"`
// 	Customerid      int    `json:"customerid"`
// 	Customername    string `json:"customername"`
// 	Contactno       string `json:"contactno"`
// 	Deliverydate    string `json:"deliverydate"`
// 	Orderstatus     string `json:"orderstatus"`
// 	Starttime       string `json:"starttime"`
// 	Arrivaltime     string `json:"arrivaltime"`
// 	Pickuptime      string `json:"pickuptime"`
// 	Deliverytime    string `json:"deliverytime"`
// 	Deliveryaddress string `json:"deliveryaddress"`
// 	Deliverylat     string `json:"deliverylat"`
// 	Deliverylong    string `json:"deliverylong"`
// 	Pickupaddress   string `json:"pickupaddress"`
// 	Pickuplat       string `json:"pickuplat"`
// 	Pickuplong      string `json:"pickuplong"`
// 	Droplat         string `json:"droplat"`
// 	Droplon         string `json:"droplon"`
// 	Notes           string `json:"notes"`
// 	Ordernotes      string `json:"ordernotes"`
// 	Locationname    string `json:"locationname"`
// }

type Ordersequences struct {
	Sequenceid        int    `json:"sequenceid" gorm:"Primary_Key"`
	Tenantid          int    `json:"tenantid"`
	Orderprefix       string `json:"orderprefix" gorm:"default:ORD"`
	Customerprefix    string `json:"customerprefix" gorm:"default:CUS"`
	Appointmentprefix string `json:"appointmentprefix" gorm:"default:ORD"`
	Receiptprefix     string `json:"receiptprefix" gorm:"default:REC"`
	Paymentprefix     string `json:"paymentprefix" gorm:"default:PAY"`
}

type Orders struct {
	Orderheaderid      int           `json:"orderheaderid" gorm:"Primary_Key"`
	Tenantid           int           `json:"tenantid"`
	Locationid         int           `json:"locationid"`
	Applocationid      int           `json:"applocationid"`
	Moduleid           int           `json:"moduleid"`
	Partnerid          int           `json:"partnerid"`
	Configid           int           `json:"configid"`
	Categoryid         int           `json:"categoryid"`
	Subcategoryid      int           `json:"subcategoryid"`
	Orderid            string        `json:"orderid"`
	Orderdate          string        `json:"orderdate,omitempty"`
	Deliverytime       string        `json:"deliverytime"`
	Deliverytype       string        `json:"deliverytype"`
	Orderstatus        string        `json:"orderstatus"`
	Pending            string        `json:"pending"`
	Processing         string        `json:"processing"`
	Ready              string        `json:"ready"`
	Delivered          string        `json:"delivered"`
	Cancelled          string        `json:"cancelled"`
	Customerid         int           `json:"customerid"`
	Pickupcustomer     string        `json:"pickupcustomer"`
	Pickupcontactno    string        `json:"pickupcontactno"`
	Pickuplandmark     string        `json:"pickuplandmark"`
	Pickuplocationid   int           `json:"pickuplocationid"`
	Pickupaddress      string        `json:"pickupaddress"`
	Pickuplocation     string        `json:"pickuplocation"`
	Pickupcity         string        `json:"pickupcity"`
	Pickuplat          string        `json:"pickuplat"`
	Pickuplong         string        `json:"pickuplong"`
	Pickupslot         string        `json:"pickupslot"`
	Deliveryid         int           `json:"deliveryid"`
	Deliverylocationid int           `json:"deliverylocationid"`
	Deliverycustomer   string        `json:"deliverycustomer"`
	Deliverycontactno  string        `json:"deliverycontactno"`
	Deliverylandmark   string        `json:"deliverylandmark"`
	Deliverylocation   string        `json:"deliverylocation"`
	Deliverycity       string        `json:"deliverycity"`
	Deliveryaddress    string        `json:"deliveryaddress"`
	Deliverylat        string        `json:"deliverylat"`
	Deliverylong       string        `json:"deliverylong"`
	Promotionid        int           `json:"promotionid"`
	Promoname          string        `json:"promoname"`
	Promoterms         string        `json:"promoterms"`
	Promovalue         int           `json:"promovalue"`
	Promoamount        float64       `json:"promoamount" gorm:"type:numeric"`
	Orderamount        float64       `json:"orderamount" gorm:"type:numeric"`
	Taxamount          float64       `json:"taxamount" gorm:"type:numeric"`
	Ordercharges       float64       `json:"ordercharges" gorm:"type:numeric"`
	Ordervalue         float64       `json:"ordervalue" gorm:"type:numeric"`
	Itemcount          int           `json:"itemcount"`
	Paymenttype        int           `json:"paymenttype"`
	Paymentstatus      int           `json:"paymentstatus"`
	Deliverycharge     float64       `json:"deliverycharge" gorm:"type:numeric"`
	Ordernotes         string        `json:"ordernotes"`
	Kms                string        `json:"kms"`
	Remarks            string        `json:"remarks"`
	Tenantuserid       int           `json:"tenantuserid"`
	Partneruserid      int           `json:"partneruserid"`
	Smsdelivery        int           `json:"smsdelivery" gorm:"default:0"`
	Quantity           int           `josn:"quantity"`
	Collectionamt      float64       `json:"collectionamt" gorm:"type:numeric"`
	Items              []OrderDetail `json:"items" gorm:"-"`
}

type OrderDetail struct {
	Orderdetailid           int     `json:"orderdetailid" gorm:"primaryKey;autoIncrement"`
	Orderheaderid           int     `json:"orderheaderid"`
	Tenantid                int     `json:"tenantid"`
	Locationid              int     `json:"locationid"`
	Productid               int     `json:"productid"`
	Productname             string  `json:"productname"`
	Productdescription      string  `json:"productdescription"`
	Supplyqty               float64 `json:"supplyqty"`
	Balanceqty              float64 `json:"balanceqty"`
	Orderqty                float64 `json:"orderqty"`
	Price                   float64 `json:"price"`
	Unitid                  int     `json:"unitid"`
	Unitname                string  `json:"unitname"`
	Productaddonid          int     `json:"productaddonid"`
	Addontypeid             int     `json:"addontypeid"`
	Productmapid            int     `json:"productmapid"`
	Productvariantid        int     `json:"productvariantid"`
	Productaddondescription string  `json:"productaddondescription"`
	Discountid              int     `json:"discountid"`
	Discountname            string  `json:"discountname"`
	Discountcode            string  `json:"discountcode"`
	Discountterms           string  `json:"discountterms"`
	Discountpercentage      float64 `json:"discountpercentage"`
	Discountamount          float64 `json:"discountamount"`
	Landingamount           float64 `json:"landingamount"`
	Taxpercentage           float64 `json:"taxpercentage"`
	Taxamount               float64 `json:"taxamount"`
	Productsumprice         float64 `json:"productsumprice"`
	Itemstatus              string  `json:"itemstatus"`
	Delivered               string  `json:"delivered"`
	Orderamount             float64 `json:"-" gorm:"-"`
	Productimage            string  `json:"productimage" gorm:"-"` // only for JSON
}

// ✅ GORM will now use `orderdetails` instead of `order_details`
func (OrderDetail) TableName() string {
	return "orderdetails"
}

type OrderDetails struct {
	Orderdetailid           int     `json:"orderdetailid" gorm:"primaryKey;autoIncrement"`
	Orderheaderid           int     `json:"orderheaderid"`
	Tenantid                int     `json:"tenantid"`
	Locationid              int     `json:"locationid"`
	Productid               int     `json:"productid"`
	Productname             string  `json:"productname"`
	Productdescription      string  `json:"productdescription"`
	Supplyqty               float64 `json:"supplyqty"`
	Balanceqty              float64 `json:"balanceqty"`
	Orderqty                float64 `json:"orderqty"`
	Price                   float64 `json:"price"`
	Unitid                  int     `json:"unitid"`
	Unitname                string  `json:"unitname"`
	Productaddonid          int     `json:"productaddonid"`
	Addontypeid             int     `json:"addontypeid"`
	Productmapid            int     `json:"productmapid"`
	Productvariantid        int     `json:"productvariantid"`
	Productaddondescription string  `json:"productaddondescription"`
	Discountid              int     `json:"discountid"`
	Discountname            string  `json:"discountname"`
	Discountcode            string  `json:"discountcode"`
	Discountterms           string  `json:"discountterms"`
	Discountpercentage      float64 `json:"discountpercentage"`
	Discountamount          float64 `json:"discountamount"`
	Landingamount           float64 `json:"landingamount"`
	Taxpercentage           float64 `json:"taxpercentage"`
	Taxamount               float64 `json:"taxamount"`
	Totaltaxamount          float64 `json:"totaltaxamount"`
	Productsumprice         float64 `json:"productsumprice"`
	Itemstatus              string  `json:"itemstatus"`
	Delivered               string  `json:"delivered"`
	Orderamount             float64 `json:"Orderamount"`  // 👈 Correct way
	Productimage            string  `json:"productimage"` // only for JSON
}

func (OrderDetails) TableName() string {
	return "orderdetails"
}

type Customerorder struct {
	Orders Orders    `json:"orders"`
	Pickup Customers `json:"pickup"`
	Drop   Customers `json:"drop"`
}

type CustomerorderV2 struct {
	Orders Orders `json:"orders"`
}

type Updateorderstatus struct {
	Orderheaderid int    `json:"Orderheaderid"`
	Orderstatus   string `json:"Orderstatus"`
	Pending       string `json:"pending"`
	Processing    string `json:"processing"`
	Cancelled     string `json:"cancelled"`
	Delivered     string `json:"delivered"`
	Userid        int    `json:"userid"`
}

type Ordersummary struct {
	Total         int    `json:"total"`
	Created       int    `json:"created"`
	Pending       int    `json:"pending"`
	Processing    int    `json:"processing"`
	Delivered     int    `json:"delivered"`
	Cancelled     int    `json:"cancelled"`
	Locationname  string `json:"locationname"`
	Applocationid string `json:"applocationid"`
}

type Ordersummarydaily struct {
	Total      int    `json:"total"`
	Created    int    `json:"created"`
	Pending    int    `json:"pending"`
	Processing int    `json:"processing"`
	Delivered  int    `json:"delivered"`
	Cancelled  int    `json:"cancelled"`
	Tenantid   int    `json:"tenantid"`
	Tenantname string `json:"tenantname"`
}

type Ordersummarylocation struct {
	Total        int    `json:"total"`
	Created      int    `json:"created"`
	Pending      int    `json:"pending"`
	Processing   int    `json:"processing"`
	Delivered    int    `json:"delivered"`
	Cancelled    int    `json:"cancelled"`
	Locationid   int    `json:"locationid"`
	Locationname string `json:"locationname"`
}
type OrderInsight struct {
	Applocationid int          `json:"applocationid" gorm:"Primary_Key"`
	Locationname  string       `json:"locationname"`
	Ordermonths   *Ordermonths `json:"ordermonths" gorm:"-"`
}

type OrderInsightv1 struct {
	Locationid   int          `json:"locationid" gorm:"Primary_Key"`
	Locationname string       `json:"locationname"`
	Ordermonths  *Ordermonths `json:"ordermonths" gorm:"-"`
}

type Ordermonths struct {
	Jan  int `json:"jan"`
	Feb  int `json:"feb"`
	Mar  int `json:"mar"`
	Apr  int `json:"apr"`
	May  int `json:"may"`
	Jun  int `json:"jun"`
	Jul  int `json:"jul"`
	Aug  int `Json:"aug"`
	Sep  int `Json:"sep"`
	Oct  int `Json:"oct"`
	Nov  int `Json:"nov"`
	Dece int `Json:"dece"`
	// Applocationid int `json:"applocationid"`
}

type CustomerOrder struct {
	Orderheaderid  int     `json:"orderheaderid" gorm:"Primary_Key"`
	Applocationid  int     `json:"applocationid"`
	Tenantid       int     `json:"tenantid"`
	Locationid     int     `json:"locationid"`
	Partnerid      int     `json:"partnerid"`
	Configid       int     `json:"configid"`
	Categoryid     int     `json:"categoryid"`
	Subcategoryid  int     `json:"subcategoryid"`
	Moduleid       int     `json:"moduleid"`
	Orderid        string  `json:"orderid"`
	Orderstatus    string  `json:"orderstatus"`
	Orderdate      string  `json:"orderdate,omitempty"`
	Ordernotes     string  `json:"ordernotes"`
	Itemcount      int     `json:"itemcount"`
	Deliverytime   string  `json:"deliverytime"` // alias for delivered
	Pending        string  `json:"pending"`
	Processing     string  `json:"processing"`
	Ready          string  `json:"ready"`
	Delivered      string  `json:"delivered"` // original delivered column
	Cancelled      string  `json:"cancelled"`
	Deliverycharge float32 `json:"deliverycharge"`
	Kms            string  `json:"kms"`

	Customerid      int    `json:"customerid"`
	Pickupaddress   string `json:"pickupaddress"`
	Pickuplat       string `json:"pickuplat"`
	Pickuplong      string `json:"pickuplong"`
	Pickupcustomer  string `json:"pickupcustomer"`
	Pickupcontactno string `json:"pickupcontactno"`
	Pickuplocation  string `json:"pickupsuburb"` // alias
	Pickupcity      string `json:"pickupcity"`

	Deliveryid        int    `json:"deliverycustomerid"` // alias
	Deliveryaddress   string `json:"deliveryaddress"`
	Deliverylat       string `json:"deliverylat"`
	Deliverylong      string `json:"deliverylong"`
	Deliverytype      string `json:"deliverytype"`
	Deliverycustomer  string `json:"deliverycustomer"`
	Deliverycontactno string `json:"deliverycontactno"`
	Deliverylocation  string `json:"deliverysuburb"` // alias
	Deliverycity      string `json:"deliverycity"`
	Paymenttype       int    `json:"paymenttype"`
	Smsdelivery       int    `json:"smsdelivery"`

	// Tenant Info
	Tenantname      string `json:"tenantname"`
	Tenanttoken     string `json:"tenanttoken"`
	Tenantcontactno string `json:"tenantcontactno"`
	Tenantpostcode  string `json:"tenantpostcode"`
	Tenantsuburb    string `json:"tenantsuburb"`
	Tenantcity      string `json:"tenantcity"`

	// Location Info
	Locationname      string `json:"locationname"`
	Locationcontactno string `json:"locationcontactno"`
	Locationpostcode  string `json:"locationpostcode"`
	Locationsuburb    string `json:"locationsuburb"`
	Locationcity      string `json:"locationcity"`

	// App Location
	Applocation string `json:"applocation"`

	// Delivery Info (from `deliveries` table)
	Deliverystatus    string `json:"deliverystatus"`
	DeliveryUserID    int    `json:"deliveryid"` // alias
	Assigntime        string `json:"assigntime"`
	Starttime         string `json:"starttime"`
	Arrivaltime       string `json:"arrivaltime"`
	Pickuptime        string `json:"pickuptime"`
	Finaldeliverytime string `json:"finaldeliverytime"` // alias for f.deliverytime
	Canceltime        string `json:"canceltime"`

	// Actualkms   sql.NullFloat64 `json:"actualkms"`
	// Riderkms    sql.NullFloat64 `json:"riderkms"`
	// Deliveryamt sql.NullFloat64 `json:"deliveryamt"`
	Droplat string `json:"droplat"`
	Droplon string `json:"droplon"`

	// Rider
	Rider       string  `json:"rider"`
	Orderamount float64 `json:"orderamount"`
	Taxamount   float64 `json:"taxamount"`

	// Items if applicable
	OrderDetails []OrderDetails `json:"orderdetails" gorm:"-"`
}

type CustomerOrderLocation struct {
	Locationname string  `json:"locationname" gorm:"column:locationname"`
	Ordercount   int     `json:"ordercount" gorm:"column:ordercount"`
	Contactno    string  `json:"contactno" gorm:"column:contactno"`
	Address      string  `json:"address" gorm:"column:address"`
	Suburb       string  `json:"suburb" gorm:"column:suburb"`
	City         string  `json:"city" gorm:"column:city"`
	State        string  `json:"state" gorm:"column:state"`
	Postcode     string  `json:"postcode" gorm:"column:postcode"`
	Latitude     float64 `json:"latitude" gorm:"column:latitude"`
	Longitude    float64 `json:"longitude" gorm:"column:longitude"`
}
