package models

import "gorm.io/gorm"

type Deliveries struct {
	Deliveryid         int     `json:"deliveryid" gorm:"Primary_Key"`
	Orderheaderid      int     `json:"orderheaderid"`
	Applocationid      int     `json:"applocationid"`
	Configid           int     `json:"configid"`
	Partnerid          int     `json:"partnerid"`
	Tenantid           int     `json:"tenantid"`
	Moduleid           int     `json:"moduleid"`
	Locationid         int     `json:"locationid"`
	Categoryid         int     `json:"categoryid"`
	Userid             int     `json:"userid"`
	Subcategoryid      int     `json:"subcategoryid"`
	Orderid            string  `json:"orderid"`
	Deliverydate       string  `json:"deliverydate"`
	Orderstatus        string  `json:"orderstatus"`
	Assigntime         string  `json:"assigntime"`
	Starttime          string  `json:"starttime"`
	Arrivaltime        string  `json:"arrivaltime"`
	Pickuptime         string  `json:"pickuptime"`
	Acceptedtime       string  `json:"acceptedtime"`
	Canceltime         string  `json:"canceltime"`
	Itemcount          int     `json:"itemcount"`
	Orderamount        float64 `json:"orderamount" gorm:"type:numeric"`
	Customerid         int     `json:"customerid"`
	Pickupcustomer     string  `json:"pickupcustomer"`
	Pickupcontactno    string  `json:"pickupcontactno"`
	Pickuplocationid   int     `json:"pickuplocationid"`
	Pickupaddress      string  `json:"Pickupaddress"`
	Pickuplocation     string  `json:"pickuplocation"`
	Pickuplat          string  `json:"pickuplat"`
	Pickuplon          string  `json:"pickuplon"`
	Deliverycustomerid int     `json:"deliverycustomerid"`
	Deliverylocationid int     `json:"deliverylocationid"`
	Deliverycustomer   string  `json:"deliverycustomer"`
	Deliverycontactno  string  `json:"deliverycontactno"`
	Deliveryaddress    string  `json:"deliveryaddress"`
	Deliverylocation   string  `json:"deliverylocation"`
	Droplat            string  `json:"droplat"`
	Droplon            string  `json:"droplon"`
	Deliverylat        string  `json:"deliverylat"`
	Deliverylong       string  `json:"deliverylong"`
	Deliverycharges    float64 `json:"deliverycharges" gorm:"type:numeric"`
	Deliveryamt        float64 `json:"deliveryamt" gorm:"type:numeric"`
	Deliverytype       string  `json:"deliverytype"`
	Notes              string  `json:"notes"`
	Ordernotes         string  `json:"ordernotes"`
	Riderslat          string  `json:"riderslat"`
	Riderslon          string  `json:"riderslon"`
	Firstmilekm        float64 `json:"firstmilekm" gorm:"type:numeric"`
	Firstmilecharges   float64 `json:"firstmilecharges" gorm:"type:numeric"`
	Lastmilecharges    float64 `json:"lastmilecharges" gorm:"type:numeric"`
	Ridercharges       float64 `json:"ridercharges" gorm:"type:numeric"`
	Kms                string  `json:"kms"`
	Actualkms          string  `json:"actualkms"`
	Smsdelivery        int     `json:"smsdelivery"`
	Paymenttype        int     `json:"paymenttype" gorm:"default:0"`
	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     `josn:"quantity"`
	Collectionamt      float64 `json:"collectionamt" gorm:"type:numeric"`
	Collectedamt       float64 `json:"collectedamt" gorm:"type:numeric"`
	Collectionstatus   float64 `json:"collectionstatus" gorm:"type:numeric"`
	Ridertime          int     `json:"ridertime"`
	// GPS tracking fields (nullable — old app versions may not send these)
	RawLatitude           *string `json:"raw_latitude" gorm:"column:raw_latitude"`
	RawLongitude          *string `json:"raw_longitude" gorm:"column:raw_longitude"`
	VelocityLat           *string `json:"velocity_lat" gorm:"column:velocity_lat"`
	VelocityLng           *string `json:"velocity_lng" gorm:"column:velocity_lng"`
	Speed                 *string `json:"speed" gorm:"column:speed"`
	Heading               *string `json:"heading" gorm:"column:heading"`
	Expecteddeliverytime  string  `json:"expecteddeliverytime"`
	Profit                float64 `json:"profit"`
	Transitminutes        float64 `json:"transitminutes" gorm:"type:numeric"`
	Calculationdistancekm float64 `json:"calculationdistancekm" gorm:"type:numeric"`
}

type UpdateDeliveryStatus struct {
	Deliveryid         int     `json:"deliveryid"`
	Deliverytype       string  `json:"deliverytype"`
	Pickuplocationid   int     `json:"pickuplocationid"`
	Deliverylocationid int     `json:"deliverylocationid"`
	Orderheaderid      int     `json:"orderheaderid"`
	Userid             int     `json:"userid"`
	Orderstatus        string  `json:"orderstatus"`
	Assigntime         string  `json:"assigntime"`
	Starttime          string  `json:"starttime"`
	Arrivaltime        string  `json:"arrivaltime"`
	Pickuptime         string  `json:"pickuptime"`
	Acceptedtime       string  `json:"acceptedtime"`
	Deliverytime       string  `json:"deliverytime"`
	Canceltime         string  `json:"canceltime"`
	Pickuplat          string  `json:"pickuplat"`
	Pickuplon          string  `json:"picklon"`
	Pickupimage        string  `json:"pickupimage"`
	Riderslat          string  `json:"riderslat"`
	Riderslon          string  `json:"riderslon"`
	Deliverylat        string  `json:"deliverylat"`
	Deliverylong       string  `json:"deliverylong"`
	Dropimage          string  `json:"dropimage"`
	Address            string  `json:"address" gorm:"<-:false"`
	Suburb             string  `json:"suburb" gorm:"<-:false"`
	City               string  `json:"city" gorm:"<-:false"`
	State              string  `json:"state" gorm:"<-:false"`
	Postcode           string  `json:"postcode" gorm:"<-:false"`
	Deliveryamt        float64 `json:"deliveryamt" gorm:"type:numeric"`
	Kms                string  `json:"kms"`
	// Actualkms          string  `json:"actualkms"`
	Riderkms         string  `json:"riderkms"`
	Ridercharges     float64 `json:"ridercharges" gorm:"type:numeric"`
	Kmcal            string  `json:"kmcal"`
	Notes            string  `json:"notes"`
	Feedback         string  `json:"feedback"`
	Smsdelivery      int     `json:"smsdelivery"`
	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"`
	Quantity         int     `josn:"quantity"`
	Collectionamt    float64 `json:"collectionamt" gorm:"type:numeric"`
	Collectedamt     float64 `json:"collectedamt" gorm:"type:numeric"`
	Collectionstatus int     `json:"collectionstatus" gorm:"default:0"`
	Ridertime        int     `json:"ridertime" gorm:"default:0"`
	Bonuspts         int     `json:"bonuspts"`
	Skippedtime      string  `json:"skippedtime"`
	Activelat        string  `json:"activelat"`
	Activelon        string  `json:"activelon"`
	// GPS tracking fields (nullable — old app versions may not send these)
	RawLatitude           *string `json:"raw_latitude" gorm:"column:raw_latitude"`
	RawLongitude          *string `json:"raw_longitude" gorm:"column:raw_longitude"`
	VelocityLat           *string `json:"velocity_lat" gorm:"column:velocity_lat"`
	VelocityLng           *string `json:"velocity_lng" gorm:"column:velocity_lng"`
	Speed                 *string `json:"speed" gorm:"column:speed"`
	Heading               *string `json:"heading" gorm:"column:heading"`
	Expecteddeliverytime  string  `json:"expecteddeliverytime"`
	Profit                float64 `json:"profit"`
	Transitminutes        float64 `json:"transitminutes" gorm:"type:numeric"`
	Calculationdistancekm float64 `json:"calculationdistancekm" gorm:"type:numeric"`
}

type Deliveryinfo struct {
	Deliveryid            int     `json:"deliveryid"`
	Orderheaderid         int     `json:"orderheaderid"`
	Applocationid         int     `json:"applocationid"`
	Applocation           string  `json:"applocation"`
	Configid              int     `json:"configid"`
	Partnerid             int     `json:"partnerid"`
	Tenantid              int     `json:"tenantid"`
	Moduleid              int     `json:"moduleid"`
	Locationid            int     `json:"locationid"`
	Categoryid            int     `json:"categoryid"`
	Userid                int     `json:"userid"`
	Subcategoryid         int     `json:"subcategoryid"`
	Orderid               string  `json:"orderid"`
	Deliverydate          string  `json:"deliverydate"`
	Orderstatus           string  `json:"orderstatus"`
	Assigntime            string  `json:"assigntime"`
	Starttime             string  `json:"starttime"`
	Arrivaltime           string  `json:"arrivaltime"`
	Pickuptime            string  `json:"pickuptime"`
	Acceptedtime          string  `json:"acceptedtime"`
	Deliverytime          string  `json:"deliverytime"`
	Canceltime            string  `json:"canceltime"`
	Itemcount             int     `json:"itemcount"`
	Orderamount           float64 `json:"orderamount" gorm:"type:numeric"`
	Customerid            int     `json:"customerid"`
	Pickupcustomer        string  `json:"pickupcustomer"`
	Pickupcontactno       string  `json:"pickupcontactno"`
	Pickuplocationid      int     `json:"pickuplocationid"`
	Pickupaddress         string  `json:"Pickupaddress"`
	Pickuplocation        string  `json:"pickuplocation"`
	Pickuplat             string  `json:"pickuplat"`
	Pickuplon             string  `json:"pickuplon"`
	Deliverycustomerid    int     `json:"deliverycustomerid"`
	Deliverylocationid    int     `json:"deliverylocationid"`
	Deliverycustomer      string  `json:"deliverycustomer"`
	Deliverycontactno     string  `json:"deliverycontactno"`
	Deliveryaddress       string  `json:"deliveryaddress"`
	Deliverylocation      string  `json:"deliverylocation"`
	Droplat               string  `json:"droplat"`
	Droplon               string  `json:"droplon"`
	Deliverylat           string  `json:"deliverylat"`
	Deliverylong          string  `json:"deliverylong"`
	Deliverycharges       float64 `json:"deliverycharges" gorm:"type:numeric"`
	Deliveryamt           float64 `json:"deliveryamt" gorm:"type:numeric"`
	Deliverytype          string  `json:"deliverytype"`
	Notes                 string  `json:"notes"`
	Ordernotes            string  `json:"ordernotes"`
	Riderslat             string  `json:"riderslat"`
	Riderslon             string  `json:"riderslon"`
	Firstmilekm           float64 `json:"firstmilekm" gorm:"type:numeric"`
	Firstmilecharges      float64 `json:"firstmilecharges" gorm:"type:numeric"`
	Lastmilecharges       float64 `json:"lastmilecharges" gorm:"type:numeric"`
	Ridercharges          float64 `json:"ridercharges" gorm:"type:numeric"`
	Kms                   string  `json:"kms"`
	Actualkms             string  `json:"actualkms"`
	Riderkms              string  `json:"riderkms"`
	Paymenttype           int     `json:"paymenttype"`
	Tenantname            string  `json:"tenantname"`
	Tenantcontactno       string  `json:"tenantcontactno"`
	Tenanttoken           string  `json:"tenanttoken"`
	Tenantsuburb          string  `json:"tenantsuburb"`
	Tenantcity            string  `json:"tenantcity"`
	Tenantaddress         string  `json:"tenantaddress"`
	Locationname          string  `json:"locationname"`
	Locationcontactno     string  `json:"locationcontactno"`
	Locationsuburb        string  `json:"locationsuburb"`
	Locationaddress       string  `json:"locationaddress"`
	Ridername             string  `json:"ridername"`
	Userfcmtoken          string  `json:"userfcmtoken"`
	Queueid               int     `json:"queueid"`
	Smsdelivery           int     `json:"smsdelivery"`
	Customertoken         string  `json:"customertoken"`
	Ridercontact          string  `json:"ridercontact"`
	Previouskms           int     `json:"previouskms" `
	Cumulativekms         int     `json:"cumulativekms" `
	Step                  int     `json:"step" gorm:"default:0"`
	Eta                   string  `json:"eta" gorm:"type:varchar(100);default:''"`
	Quantity              int     `josn:"quantity"`
	Collectionamt         float64 `json:"collectionamt" gorm:"type:numeric"`
	Collectedamt          float64 `json:"collectedamt" gorm:"type:numeric"`
	Collectionstatus      float64 `json:"collectionstatus" gorm:"type:numeric"`
	Ridertime             int     `json:"ridertime"`
	Slab                  string  `json:"slab"`
	Pricingdate           string  `json:"pricingdate"`
	Baseprice             float64 `json:"baseprice" gorm:"type:numeric"`
	Minkm                 int     `json:"minkm"`
	Priceperkm            float64 `json:"priceperkm" gorm:"type:numeric"`
	Maxkm                 int     `json:"maxkm"`
	Orders                int     `json:"orders"`
	Othercharges          float64 `json:"othercharges" gorm:"type:numeric"`
	Surgecharges          float64 `json:"surgecharges" gorm:"type:numeric"`
	Expecteddeliverytime  string  `json:"expecteddeliverytime"`
	Profit                float64 `json:"profit"`
	Transitminutes        float64 `json:"transitminutes" gorm:"type:numeric"`
	Calculationdistancekm float64 `json:"calculationdistancekm" gorm:"type:numeric"`
}

type Deliveryqueues struct {
	Queueid       int    `json:"queueid" gorm:"Primary_Key"`
	Tenantid      int    `json:"tenantid"`
	Locationid    int    `json:"locationid"`
	Orderheaderid int    `json:"orderheaderid"`
	Deliveryid    int    `json:"deliveryid"`
	Userid        int    `json:"userid"`
	Partnerid     int    `json:"partnerid"`
	Orderid       string `json:"orderid"`
	Latitude      string `json:"latitude"`
	Longitude     string `json:"longitude"`
	Accept        int    `json:"accept"`
	Decline       int    `json:"decline"`
	Queuestatus   int    `json:"queuestatus"`
}

type Deliverylogs struct {
	Logid         int    `json:"logid" gorm:"Primary_Key"`
	Logdate       string `json:"logdate"`
	Tenantid      int    `json:"tenantid"`
	Locationid    int    `json:"locationid"`
	Orderheaderid int    `json:"orderheaderid"`
	Deliveryid    int    `json:"deliveryid"`
	Userid        int    `json:"userid"`
	Partnerid     int    `json:"partnerid"`
	Orderid       string `json:"orderid"`
	Orderstatus   string `json:"orderstatus"`
	Latitude      string `json:"latitude"`
	Longitude     string `json:"longitude"`
	Logstatus     *int   `json:"logstatus" gorm:"default:0"`

	Firstname string `json:"firstname"`
	Lastname  string `json:"lastname"`
	// GPS tracking fields (nullable — old app versions may not send these)
	RawLatitude  *string `json:"raw_latitude" gorm:"column:raw_latitude"`
	RawLongitude *string `json:"raw_longitude" gorm:"column:raw_longitude"`
	VelocityLat  *string `json:"velocity_lat" gorm:"column:velocity_lat"`
	VelocityLng  *string `json:"velocity_lng" gorm:"column:velocity_lng"`
	Speed        *string `json:"speed" gorm:"column:speed"`
	Heading      *string `json:"heading" gorm:"column:heading"`
}

type Deliverydet struct {
	Deliveries int     `json:"deliveries"`
	Delivered  int     `json:"Delivered"`
	Cancelled  int     `json:"cancelled"`
	Kms        float64 `json:"kms" gorm:"type:numeric"`
	Amount     float64 `json:"amount" gorm:"type:numeric"`
}

type DeliverySummary struct {
	Total     int `json:"total"`
	Created   int `json:"created"`
	Pending   int `json:"pending"`
	Accepted  int `json:"accepted"`
	Arrived   int `json:"arrived"`
	Picked    int `json:"picked"`
	Active    int `json:"active"`
	Delivered int `json:"delivered"`
	Cancelled int `json:"cancelled"`
	Skipped   int `json:"skipped"`
}

type DeliveryDetailsCount struct {
	Assigned  int `json:"assigned"`
	Accepted  int `json:"accepted"`
	Arrived   int `json:"Arrived"`
	Picked    int `json:"picked"`
	Active    int `json:"active"`
	Delivered int `json:"delivered"`
	Cancelled int `json:"cancelled"`
}

type ReportSummary struct {
	Tenantid            int     `json:"tenantid"`
	Tenantname          string  `json:"tenantname"`
	Locationid          int     `json:"locationid"`
	Locationname        string  `json:"locationname"`
	Totalorders         int     `json:"totalorders"`
	Orderscreated       int     `json:"orderscreated"`
	Orderspending       int     `json:"Orderspending"`
	Orderscompleted     int     `json:"orderscompleted"`
	Orderscancelled     int     `json:"orderscancelled"`
	Deliveriespending   int     `json:"deliveriespending"`
	Deliveriescompleted int     `json:"deliveriescompleted"`
	Deliveriescancelled int     `json:"deliveriescancelled"`
	Paylater            float64 `json:"paylater" gorm:"type:numeric"`
	Payondelivery       float64 `json:"payondelivery" gorm:"type:numeric"`
	Kms                 float64 `json:"kms" gorm:"type:numeric"`
	Actualkms           float64 `json:"actualkms" gorm:"type:numeric"`
	Charges             float64 `json:"charges" gorm:"type:numeric"`
	Previouskms         int     `json:"previouskms"`
	Cumulativekms       int     `json:"cumulativekms"`
	Deliveryamt         float64 `json:"deliveryamt" gorm:"type:numeric"`
	Riderkms            float64 `json:"riderkms" gorm:"type:numeric"`
	Quantity            int     `josn:"quantity"`
	Collectionamt       float64 `json:"collectionamt" gorm:"type:numeric"`
	Collectedamt        float64 `json:"collectedamt" gorm:"type:numeric"`
	Collectionstatus    float64 `json:"collectionstatus" gorm:"type:numeric"`
}

type UserReportSummary struct {

	// 🔹 User (Rider) details
	Userid       int    `json:"userid"`
	Firstname    string `json:"firstname"`
	Lastname     string `json:"lastname"`
	Ridercontact string `json:"ridercontact"`

	// 🔹 Tenant details
	Tenantid   int    `json:"tenantid"`
	Tenantname string `json:"tenantname"`

	// 🔹 Location details
	Locationid   int    `json:"locationid"`
	Locationname string `json:"locationname"`

	// 🔹 Order summary
	Totalorders     int `json:"totalorders"`
	Orderscreated   int `json:"orderscreated"`
	Orderspending   int `json:"orderspending"`
	Orderscompleted int `json:"orderscompleted"`
	Orderscancelled int `json:"orderscancelled"`

	// 🔹 Delivery summary
	Deliveriespending   int `json:"deliveriespending"`
	Deliveriescompleted int `json:"deliveriescompleted"`
	Deliveriescancelled int `json:"deliveriescancelled"`

	// 🔹 Payment summary
	Paylater      float64 `json:"paylater"`
	Payondelivery float64 `json:"payondelivery"`

	// 🔹 Distance summary
	Kms           float64 `json:"kms"`
	Actualkms     float64 `json:"actualkms"`
	Previouskms   float64 `json:"previouskms"`
	Cumulativekms float64 `json:"cumulativekms"`
	Riderkms      float64 `json:"riderkms"`

	// 🔹 Amount summary
	Charges     float64 `json:"charges"`
	Deliveryamt float64 `json:"deliveryamt"`

	// 🔹 Collection summary
	Quantity         int     `json:"quantity"`
	Collectionamt    float64 `json:"collectionamt"`
	Collectedamt     float64 `json:"collectedamt"`
	Collectionstatus int     `json:"collectionstatus"`
}

type Ridersummary struct {
	Userid           int     `json:"userid"`
	Firstname        string  `json:"firstname"`
	Lastname         string  `json:"lastname"`
	Ridercontact     string  `json:"ridercontact"`
	Tenantid         int     `json:"tenantid"`
	Tenantname       string  `json:"tenantname"`
	Locationid       int     `json:"locationid"`
	Locationname     string  `json:"locationname"`
	Totalorders      int     `json:"totalorders"`
	Pending          int     `json:"pending"`
	Assigned         int     `json:"assigned"`
	Accepted         int     `json:"accepted"`
	Picked           int     `json:"picked"`
	Arrived          int     `json:"arrived"`
	Active           int     `json:"active"`
	Skipped          int     `json:"skipped"`
	Delivered        int     `json:"delivered"`
	Cancelled        int     `json:"cancelled"`
	Kms              float64 `json:"kms" gorm:"type:numeric"`
	Actualkms        float64 `json:"actualkms" gorm:"type:numeric"`
	Previouskms      int     `json:"previouskms"`
	Cumulativekms    int     `json:"cumulativekms"`
	Payondelivery    float64 `json:"payondelivery" gorm:"type:numeric"`
	Paylater         float64 `json:"Paylater" gorm:"type:numeric"`
	Deliveryamt      float64 `json:"deliveryamt" gorm:"type:numeric"`
	Status           string  `json:"status"`
	Quantity         int     `josn:"quantity"`
	Collectionamt    float64 `json:"collectionamt" gorm:"type:numeric"`
	Collectedamt     float64 `json:"collectedamt" gorm:"type:numeric"`
	Collectionstatus float64 `json:"collectionstatus" gorm:"type:numeric"`
}

type DeliveryQuery struct {
	Tenantid      int
	Partnerid     int
	UserID        int
	Appuserid     int
	Applocationid int
	Locationid    int
	Configid      int
	Fromdate      string
	ToDate        string
	Status        string
	Pageno        int
	Pagesize      int
	Conn          *gorm.DB
	Keyword       string `json:"keyword"`
}
