package models

import "encoding/json"

type Segment struct {
	ID0              int             `gorm:"column:id_0;primaryKey" json:"id_0"`
	MapID            int             `gorm:"column:mapid" json:"mapid"`
	SegmentType      string          `gorm:"column:segment_type" json:"segment_type"`
	SegmentStatus    string          `gorm:"column:segment_status" json:"segment_status"`
	ID               int             `gorm:"column:id" json:"id"`
	ProtectionStatus string          `gorm:"column:protection_status" json:"protection_status"`
	QCFlag           string          `gorm:"column:qc_flag" json:"qc_flag"`
	Geometry         json.RawMessage `gorm:"column:geometry" json:"geometry"`
}

func (Segment) TableName() string {
	return "eli_test.segment2"
}

// New struct for GeoJSON response with Geometry as raw JSON
type SegmentGeoJSON struct {
	ID0              int             `gorm:"column:id_0" json:"id_0"`
	MapID            int             `gorm:"column:mapid" json:"mapid"`
	SegmentType      string          `gorm:"column:segment_type" json:"segment_type"`
	SegmentStatus    string          `gorm:"column:segment_status" json:"segment_status"`
	ID               int             `gorm:"column:id" json:"id"`
	ProtectionStatus string          `gorm:"column:protection_status" json:"protection_status"`
	QCFlag           string          `gorm:"column:qc_flag" json:"qc_flag"`
	Geometry         json.RawMessage `gorm:"column:geometry" json:"geometry"` // Added missing geometry field
}

// Sites struct (exported, with tags and GORM column names)
type Sites struct {
	GID                  int      `json:"gid" gorm:"primaryKey;column:gid"`
	ID                   *int     `json:"id" gorm:"column:id"`
	MapProjectID         *int     `json:"mapprojectid" gorm:"column:mapprojectid"`
	Longitude            *string  `json:"longitude" gorm:"column:longitude"`
	Latitude             *string  `json:"latitude" gorm:"column:latitude"`
	Exclude              *int     `json:"exclude" gorm:"column:exclude"`
	Custom               *int     `json:"custom" gorm:"column:custom"`
	Color                *string  `json:"color" gorm:"column:color"`
	Opacity              *string  `json:"opacity" gorm:"column:opacity"`
	ShapeID              *string  `json:"shapeid" gorm:"column:shapeid"`
	StyleSize            *string  `json:"stylesize" gorm:"column:stylesize"`
	CreatedBy            *int     `json:"createdby" gorm:"column:createdby"`
	CreatedDate          *int     `json:"createddate" gorm:"column:createddate"`
	ModifiedBy           *int     `json:"modifiedby" gorm:"column:modifiedby"`
	ModifiedDate         *int     `json:"modifieddate" gorm:"column:modifieddate"`
	HistoryID            *int     `json:"historyid" gorm:"column:historyid"`
	Name                 *string  `json:"name" gorm:"column:name"`
	StatusID             *int     `json:"statusid" gorm:"column:statusid"`
	Group1               *string  `json:"group1" gorm:"column:group1"`
	Group2               *string  `json:"group2" gorm:"column:group2"`
	IconTypeID           *int     `json:"icontypeid" gorm:"column:icontypeid"`
	SchoolID             *string  `json:"schoolid" gorm:"column:schoolid"`
	SiteDemarc           *string  `json:"sitedemarc" gorm:"column:sitedemarc"`
	Address1             *string  `json:"address1" gorm:"column:address1"`
	Address2             *string  `json:"address2" gorm:"column:address2"`
	City                 *string  `json:"city" gorm:"column:city"`
	State                *string  `json:"state" gorm:"column:state"`
	Zip                  *string  `json:"zip" gorm:"column:zip"`
	ConnectivityStatus   *string  `json:"connectivity_status" gorm:"column:connectivity_status"`
	ConnectivityDistance *float64 `json:"connectivity_distance" gorm:"column:connectivity_distance"`
}

// SitesGeoJSON struct (for your geojson API response)
type SitesGeoJSON struct {
	GID          int             `json:"gid" gorm:"column:gid"`
	ID           *int            `json:"id" gorm:"column:id"`
	MapProjectID *int            `json:"mapprojectid" gorm:"column:mapprojectid"`
	Name         *string         `json:"name" gorm:"column:name"`
	Address1     *string         `json:"address1" gorm:"column:address1"`
	City         *string         `json:"city" gorm:"column:city"`
	State        *string         `json:"state" gorm:"column:state"`
	Zip          *string         `json:"zip" gorm:"column:zip"`
	Geometry     json.RawMessage `json:"geometry" gorm:"column:geometry"`
}

// Poles struct (exported, full DB mapping)
type Poles struct {
	GID              int     `json:"gid" gorm:"primaryKey;column:gid"`
	ID               *int    `json:"id" gorm:"column:id"`
	MapProjectID     *int    `json:"mapprojectid" gorm:"column:mapprojectid"`
	Latitude         *string `json:"latitude" gorm:"column:latitude"`
	Longitude        *string `json:"longitude" gorm:"column:longitude"`
	Custom           *int    `json:"custom" gorm:"column:custom"`
	Color            *string `json:"color" gorm:"column:color"`
	ShapeID          *string `json:"shapeid" gorm:"column:shapeid"`
	StyleSize        *string `json:"stylesize" gorm:"column:stylesize"`
	Opacity          *string `json:"opacity" gorm:"column:opacity"`
	CreatedBy        *int    `json:"createdby" gorm:"column:createdby"`
	CreatedDate      *int    `json:"createddate" gorm:"column:createddate"`
	ModifiedBy       *int    `json:"modifiedby" gorm:"column:modifiedby"`
	ModifiedDate     *int    `json:"modifieddate" gorm:"column:modifieddate"`
	HistoryID        *int    `json:"historyid" gorm:"column:historyid"`
	Name             *string `json:"name" gorm:"column:name"`
	Tags             *string `json:"tags" gorm:"column:tags"`
	Group1           *string `json:"group1" gorm:"column:group1"`
	Group2           *string `json:"group2" gorm:"column:group2"`
	MRStateID        *int    `json:"mrstateid" gorm:"column:mrstateid"`
	CommsMRChoiceID  *int    `json:"commsmrchoiceid" gorm:"column:commsmrchoiceid"`
	PowerMRChoiceID  *string `json:"powermrchoiceid" gorm:"column:powermrchoiceid"`
	PoleHeight       *string `json:"poleheight" gorm:"column:poleheight"`
	AttachmentHeight *string `json:"attachmentheight" gorm:"column:attachmentheight"`
	MRNotes          *string `json:"mrnotes" gorm:"column:mrnotes"`
	Owner            *string `json:"owner" gorm:"column:owner"`
	Geom             []byte  `json:"geom" gorm:"column:geom"`
}

// PolesGeoJSON struct (for geojson response)
type PolesGeoJSON struct {
	GID              int             `json:"gid" gorm:"column:gid"`
	ID               *int            `json:"id" gorm:"column:id"`
	MapProjectID     *int            `json:"mapprojectid" gorm:"column:mapprojectid"`
	Name             *string         `json:"name" gorm:"column:name"`
	Tags             *string         `json:"tags" gorm:"column:tags"`
	Group1           *string         `json:"group1" gorm:"column:group1"`
	Group2           *string         `json:"group2" gorm:"column:group2"`
	Owner            *string         `json:"owner" gorm:"column:owner"`
	PoleHeight       *string         `json:"poleheight" gorm:"column:poleheight"`
	AttachmentHeight *string         `json:"attachmentheight" gorm:"column:attachmentheight"`
	Geometry         json.RawMessage `json:"geometry" gorm:"column:geometry"`
}

type AccessPointGeoJSON struct {
	GID          int             `json:"gid" gorm:"column:gid"`
	ID           *int            `json:"id" gorm:"column:id"`
	Name         *string         `json:"name" gorm:"column:name"`
	MapProjectID *int            `json:"mapprojectid" gorm:"column:mapprojectid"`
	Latitude     *string         `json:"latitude" gorm:"column:latitude"`
	Longitude    *string         `json:"longitude" gorm:"column:longitude"`
	Manufacturer *string         `json:"manufacturer" gorm:"column:manufacturer"`
	Size         *string         `json:"size" gorm:"column:size"`
	Locked       *int            `json:"locked" gorm:"column:locked"`
	Description  *string         `json:"description" gorm:"column:description"`
	AKA          *string         `json:"aka" gorm:"column:aka"`
	CreatedBy    *int            `json:"createdby" gorm:"column:createdby"`
	CreatedDate  *int            `json:"createddate" gorm:"column:createddate"`
	ModifiedBy   *string         `json:"modifiedby" gorm:"column:modifiedby"`
	ModifiedDate *string         `json:"modifieddate" gorm:"column:modifieddate"`
	HistoryID    *int            `json:"historyid" gorm:"column:historyid"`
	Group1       *string         `json:"group1" gorm:"column:group1"`
	Group2       *string         `json:"group2" gorm:"column:group2"`
	TypeID       *int            `json:"typeid" gorm:"column:typeid"`
	StatusID     *int            `json:"statusid" gorm:"column:statusid"`
	CRMVendorID  *string         `json:"crmvendorid" gorm:"column:crmvendorid"`
	BillDate     *string         `json:"billdate" gorm:"column:billdate"`
	Geometry     json.RawMessage `json:"geometry" gorm:"column:geometry"` // Changed to json.RawMessage
}

func (AccessPointGeoJSON) TableName() string {
	return "verofy.access_points"
}

type InfoGeoJSON struct {
	ID          int             `json:"id" gorm:"primaryKey;column:id"`
	Name        *string         `json:"name" gorm:"column:name"`
	Tags        *string         `json:"tags" gorm:"column:tags"`
	Description *string         `json:"description" gorm:"column:description"`
	Group1      *string         `json:"group_1" gorm:"column:group_1"`
	Group2      *string         `json:"group_2" gorm:"column:group_2"`
	Geometry    json.RawMessage `json:"geometry" gorm:"column:geometry"` // Fixed column name
}

func (InfoGeoJSON) TableName() string {
	return "verofy.Info"
}

type MarketOption struct {
	MapID   int    `json:"mapid" gorm:"column:mapid"`
	Project string `json:"project" gorm:"column:project"`
}
