package sql

func (s *Store) createPostgresSchema() error {
	_, err := s.db.Exec(`
		CREATE TABLE IF NOT EXISTS endpoints (
			endpoint_id    BIGSERIAL PRIMARY KEY,
			endpoint_key   TEXT UNIQUE,
			endpoint_name  TEXT,
			endpoint_group TEXT,
			UNIQUE(endpoint_name, endpoint_group)
		)
	`)
	if err != nil {
		return err
	}
	_, err = s.db.Exec(`
		CREATE TABLE IF NOT EXISTS endpoint_events (
			endpoint_event_id  BIGSERIAL PRIMARY KEY,
			endpoint_id        INTEGER REFERENCES endpoints(endpoint_id) ON DELETE CASCADE,
			event_type         TEXT,
			event_timestamp    TIMESTAMP
		)
	`)
	if err != nil {
		return err
	}
	_, err = s.db.Exec(`
		CREATE TABLE IF NOT EXISTS endpoint_results (
			endpoint_result_id     BIGSERIAL PRIMARY KEY,
			endpoint_id            BIGINT REFERENCES endpoints(endpoint_id) ON DELETE CASCADE,
			success                BOOLEAN,
			errors                 TEXT,
			connected              BOOLEAN,
			status                 BIGINT,
			dns_rcode              TEXT,
			certificate_expiration BIGINT,
			hostname               TEXT,
			ip                     TEXT,
			duration               BIGINT,
			timestamp              TIMESTAMP
		)
	`)
	if err != nil {
		return err
	}
	_, err = s.db.Exec(`
		CREATE TABLE IF NOT EXISTS endpoint_result_conditions (
			endpoint_result_condition_id  BIGSERIAL PRIMARY KEY,
			endpoint_result_id            BIGINT REFERENCES endpoint_results(endpoint_result_id) ON DELETE CASCADE,
			condition                     TEXT,
			success                       BOOLEAN
		)
	`)
	if err != nil {
		return err
	}
	_, err = s.db.Exec(`
		CREATE TABLE IF NOT EXISTS endpoint_uptimes (
			endpoint_uptime_id     BIGSERIAL PRIMARY KEY,
			endpoint_id            BIGINT REFERENCES endpoints(endpoint_id) ON DELETE CASCADE,
			hour_unix_timestamp    BIGINT,
			total_executions       BIGINT,
			successful_executions  BIGINT,
			total_response_time    BIGINT,
			UNIQUE(endpoint_id, hour_unix_timestamp)
		)
	`)
	return err
}