package schema

import (
	"github.com/jmoiron/sqlx"
)

type schema struct {
	create string
	drop   string
}

func MustCreate(db *sqlx.DB) {
	db.MustExec(defaultSchema.create)
}

func MustDrop(db *sqlx.DB) {
	db.MustExec(defaultSchema.drop)
}

// Type time_reserve stores the reserve time reserve by time
// Type TIME(0) has minimal accuracy, counts down by seconds
// Type SMALLDATETIME has format'YYYYMMDD hh:mm', for example '20090212 12:30', counts down by minuts
var defaultSchema = schema{
	create: `
	CREATE TABLE IF NOT EXISTS Tables (
    id INTEGER
    CONSTRAINT PK_Tables PRIMARY KEY AUTOINCREMENT,
    name INTEGER NOT NULL UNIQUE,
    max_people INTEGER NOT NULL,
    room TEXT NOT NULL,
    CONSTRAINT CHK_max_people CHECK (
      max_people > 0
      AND max_people < 11
    )
  );
  CREATE TABLE IF NOT EXISTS Bookings (
    id INTEGER
    CONSTRAINT PK_Bookings PRIMARY KEY AUTOINCREMENT,
    id_tables INTEGER,
    reservation TEXT NOT NULL,
    time_reserve TEXT NOT NULL,
    who_booked TEXT NOT NULL,
    CONSTRAINT FK_Bookings_Tables FOREIGN KEY (id_tables) REFERENCES Tables (id),
    CONSTRAINT CHK_min_max_time_reserve CHECK (time_reserve BETWEEN "00:30" AND "12:00")
  );
CREATE TRIGGER IF NOT EXISTS CHK_Bookings_Insert
BEFORE INSERT ON Bookings
BEGIN
  SELECT RAISE(
    FAIL,
    "Reservation of table is not possible due to the existing reservation"
  )
  FROM (
    SELECT
      datetime(NEW.reservation) AS new_res_dt,
      datetime(reservation) AS res_dt,
      datetime(reservation, time_reserve) AS reserved_until,
      id_tables
    FROM Bookings
  )
  WHERE
    (new_res_dt >= res_dt AND new_res_dt < reserved_until)
    AND id_tables = NEW.id_tables;
END;
`,
}
