package models

import "time"

type (
	IncidentTierTp    string
	BizRegionTp       string
	IncidentLogItemTp string
)

const (
	IncidentTierT0 IncidentTierTp = "t0"
	IncidentTierT1 IncidentTierTp = "t1"
	IncidentTierT2 IncidentTierTp = "t2"
	IncidentTierT3 IncidentTierTp = "t3"
	IncidentTierT4 IncidentTierTp = "t4"

	BizRegionJP   BizRegionTp = "jp"
	BizRegionAPAC BizRegionTp = "apac"
	BizRegionEMEA BizRegionTp = "emea"
	BizRegionNA   BizRegionTp = "us"

	IncidentLogItemTpText       IncidentLogItemTp = "text"
	IncidentLogItemTpPostMortem IncidentLogItemTp = "postmortem"
	IncidentLogItemTpGeneral    IncidentLogItemTp = "general"
	IncidentLogItemTpMilestone  IncidentLogItemTp = "milestone"
)

type Incident struct {
	Updatable

	Name                   string         `gorm:"column:name;type:varchar(255);not null"`
	IncidentTier           IncidentTierTp `gorm:"column:tier;type:enum('t0','t1','t2','t3','t4');"`
	Oncallers              string         `gorm:"column:oncallers;type:varchar(2000);"`
	TeamLeaders            string         `gorm:"column:team_leaders;type:varchar(2000);"`
	FBOwners               string         `gorm:"column:fbowners;type:varchar(2000);"`
	Status                 string         `gorm:"column:status;type:varchar(255);not null"`
	BizRegion              string         `gorm:"column:biz_region;type:varchar(255);not null"`
	JiraIssues             *string        `gorm:"column:jira_issues;type:varchar(2000);"`
	FeishuLinks            *string        `gorm:"column:feishu_links;type:varchar(2000);"`
	Components             string         `gorm:"column:components;type:varchar(2000);"`
	Description            string         `gorm:"column:description;type:varchar(2000);not null;default:''"`
	IncidentStartTime      *time.Time     `gorm:"column:incident_start_time;type:timestamp;default:null"`
	IncidentResolvedTime   *time.Time     `gorm:"column:incident_resolve_time;type:timestamp;default:null"`
	WarRoomID              *uint64        `gorm:"column:war_room_id;type:bigint(20) unsigned;default:null;index"`
	FeishuChannelMessage   string         `gorm:"column:feishu_channel_msg;type:varchar(255);default null"`
	ToDoActionImportStatus string         `gorm:"column:postmortem_todo_action_import_status;type:varchar(32);not null;default:''"`
}

func (i Incident) TableName() string {
	return "incidents"
}

type IncidentLogItem struct {
	Updatable

	LogItemType    IncidentLogItemTp `gorm:"column:type;type:enum('text','postmortem','general','milestone')"`
	Content        string            `gorm:"column:content;type:varchar(2000)"`
	PostMortemLink string            `gorm:"column:postmortem_link;type:varchar(200)"`
	IncidentId     uint64            `gorm:"column:incident_id;type:bigint(20) unsigned"`
	Status         string            `gorm:"column:status;type:varchar(25);not null;default 'ongoing'"`
	EventTime      *time.Time        `gorm:"column:event_time;type:timestamp;default null"`
	MilestoneType  string            `gorm:"column:milestone_type;type:varchar(50);default null"`
	From           string            `gorm:"column:from_where;type:varchar(50);default null"`
}

func (i IncidentLogItem) TableName() string {
	return "incident_logitem"
}

type IncidentPostMortem struct {
	Updatable

	IncidentId            uint64     `gorm:"column:incident_id;type:bigint(20) unsigned"`
	ReviewedAt            *time.Time `gorm:"column:reviewed_at;type:timestamp;default null"`
	InvolvedEngineers     string     `gorm:"column:involved_engineers;type:varchar(2000);not null"`
	IncidentStartTime     *time.Time `gorm:"column:incident_start_time;type:timestamp;default null"`
	IncidentEndTime       *time.Time `gorm:"column:incident_end_time;type:timestamp;default null"`
	ImpactedTenants       string     `gorm:"column:involved_tenants;default null"`
	TechnicalImpactLevel  string     `gorm:"column:technical_impact_level"` // todo type
	MinutesToResolved     uint64     `gorm:"column:minutes_to_resolved;type:bigint(20)"`
	CustomerImpactMinutes uint64     `gorm:"column:customer_impact_minutes;type:bigint(20)"`
	Summary               string     `gorm:"column:summary;type:varchar(2000);not null;default ''"`
	Impact                string     `gorm:"column:impact;type:varchar(2000);not null;default ''"`
	MinutesToDetect       uint64     `gorm:"column:minutes_to_detect;type:bigint(20)"`
	Resolution            string     `gorm:"column:resolution;type:varchar(2000);not null;default ''"`
	RootCauses            string     `gorm:"column:root_causes;type:varchar(2000);not null;default ''"`
	Background            string     `gorm:"column:background;type:varchar(2000);not null;default ''"`
	BugMechanism          string     `gorm:"column:bug_mechanism;type:varchar(2000);not null;default ''"`
	WhatWorked            string     `gorm:"column:what_worked;type:varchar(2000);not null;default ''"`
	WhatDidNotWork        string     `gorm:"column:what_did_not_work;type:varchar(2000);not null;default ''"`
	WhereWeWereLucky      string     `gorm:"column:where_we_were_lucky;type:varchar(2000);not null;default ''"`
	TopIssues             string     `gorm:"column:top_issues"`
	PostMortemDocURL      *string    `gorm:"column:postmortem_doc_url"`
}

func (i IncidentPostMortem) TableName() string {
	return "incident_postmortem"
}

type IncidentPostMortemTimelineItem struct {
	Id uint64 `gorm:"column:id;primary_key;not null"`

	PostMortemId uint64     `gorm:"column:postmortem_id;type:bigint(20) unsigned"`
	HappenedAt   *time.Time `gorm:"column:happened_at;type:timestamp;default null"`
	ItemType     string     `gorm:"column:item_type"` // todo type
	Description  string     `gorm:"column:description;type:varchar(2000);not null;default ''"`
}

func (i IncidentPostMortemTimelineItem) TableName() string {
	return "incident_postmortem_timeline"
}

type IncidentPostMortemToDoAction struct {
	Updatable

	IncidentId      *uint64    `gorm:"column:incident_id;type:bigint(20) unsigned;index"`
	PostMortemId    *uint64    `gorm:"column:postmortem_id;type:bigint(20) unsigned;index"`
	Persons         *string    `gorm:"column:persons;type:varchar(2000)"`
	Deadline        *time.Time `gorm:"column:deadline;type:timestamp;default null"`
	Status          *string    `gorm:"column:status;type:varchar(200);default null"` // todo type
	Title           *string    `gorm:"column:title;type:varchar(200);default null"`
	Type            *string    `gorm:"column:type;type:varchar(200);default null"`
	Priority        *string    `gorm:"column:priority;type:varchar(200);default null"`
	Description     *string    `gorm:"column:description;type:varchar(2000);default null"`
	LinkedJiraIssue *string    `gorm:"column:linked_jira_issue;type:varchar(200);default null"`
	TCOCPCreatedAt  *time.Time `gorm:"column:tcocp_created_at;type:timestamp;default null"`
	FeishuTaskId    *string    `gorm:"column:feishu_task_id;type:varchar(2000)"`
}

func (i IncidentPostMortemToDoAction) TableName() string {
	return "incident_postmortem_todoaction"
}
