CREATE TABLE versions (
  converter TEXT,
  converter_git TEXT
);

CREATE TABLE ps_boards (
  id INTEGER NOT NULL PRIMARY KEY,
  daughterboard_id INTEGER
);

CREATE TABLE qaqc_single_run_results (
  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  runid INTEGER NOT NULL,
  psboard_id INTEGER NOT NULL,
  daughterboard_id INTEGER,
  position INTEGER,
  resistance_test_passed BOOLEAN NOT NULL,
  qspip INTEGER,
  recov INTEGER,
  power INTEGER,
  clock INTEGER,
  asdtp INTEGER,
  reset INTEGER,
  qaqc_result INTEGER,
  lvds_tx_skew REAL,
  power_3v3d REAL,
  power_3v3a REAL,
  power_n3va REAL,
  note TEXT,
  is_slavelog_valid BOOLEAN,
  is_slaveclocklog_valid BOOLEAN,
  FOREIGN KEY("runid") REFERENCES "qaqc_runs"("id"),
  FOREIGN KEY("psboard_id") REFERENCES "ps_boards"("id"),
  FOREIGN KEY("position") REFERENCES "qaqc_positions"("id")
);

CREATE TABLE qaqc_runs (
  id INTEGER NOT NULL PRIMARY KEY,
  campaign_id REAL,
  run_datetime DATETIME,
  note TEXT,
  shifter TEXT NOT NULL,
  logfile TEXT,
  shiftscript_ver TEXT,
  FOREIGN KEY("campaign_id") REFERENCES "qaqc_campaigns"("id")
);

CREATE TABLE qaqc_dispatch (
  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  qaqc_campaign_id INTEGER,
  psb_id INTEGER,
  source_place TEXT NOT NULL,
  destination TEXT NOT NULL,
  time DATETIME,
  FOREIGN KEY("qaqc_campaign_id") REFERENCES "qaqc_campaigns"("id"),
  FOREIGN KEY("psb_id") REFERENCES "ps_boards"("id")
);

CREATE TABLE qaqc_campaigns (
  id REAL NOT NULL PRIMARY KEY,
  start_date DATETIME NOT NULL,
  end_date DATETIME NOT NULL,
  note TEXT
);

CREATE TABLE qaqc_resistance_check (
  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  psb_id INTEGER NOT NULL,
  passed BOOLEAN,
  FOREIGN KEY("psb_id") REFERENCES "ps_boards"("id")
);

CREATE TABLE qaqc_extra_run_results (
  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  runid INTEGER,
  psboard_id INTEGER NOT NULL,
  position INTEGER,
  num_tests INTEGER,
  insufficient_reset_with_10 INTEGER,
  reset_failed_though_reconfig_done INTEGER,
  always_hit_flag_true INTEGER,
  dac_is_0 INTEGER,
  bcid_shift INTEGER,
  efficiency_99percent INTEGER,
  bcid_fail_111 INTEGER,
  bcid_fail_000 INTEGER,
  low_efficiency INTEGER,
  bcid_fail INTEGER,
  invalid_register_value INTEGER,
  power_out_of_range INTEGER,
  note TEXT,
  is_slavelog_valid BOOLEAN,
  FOREIGN KEY("runid") REFERENCES "qaqc_runs"("id"),
  FOREIGN KEY("psboard_id") REFERENCES "ps_boards"("id"),
  FOREIGN KEY("position") REFERENCES "qaqc_positions"("id")
);

-- TODO: add table for descriptions of each error?

CREATE TABLE qaqc_positions (
  id INTEGER NOT NULL PRIMARY KEY,
  name TEXT NOT NULL UNIQUE,
  station INTEGER NOT NULL,
  position INTEGER NOT NULL,
  rising_ns NUMERIC NOT NULL
);

CREATE VIEW qaqc_single_run_table
AS
  SELECT
    ps_boards.id AS psboard_id,
    qaqc_single_run_results.daughterboard_id,
    qaqc_single_run_results.runid AS runid,
    qaqc_runs.run_datetime AS run_timestamp,
    qaqc_runs.shifter,
    qaqc_runs.note AS run_note,
    qaqc_positions.name as position,
    qaqc_single_run_results.qspip,
    qaqc_single_run_results.recov,
    qaqc_single_run_results.power,
    qaqc_single_run_results.clock,
    qaqc_single_run_results.asdtp,
    qaqc_single_run_results.reset,
    qaqc_single_run_results.qaqc_result,
    qaqc_single_run_results.lvds_tx_skew - qaqc_positions.rising_ns AS lvds_tx_skew,
    qaqc_runs.shiftscript_ver,
    qaqc_single_run_results.note AS result_note
  FROM
    ps_boards,
    qaqc_single_run_results,
    qaqc_positions,
    qaqc_runs
  WHERE
    ps_boards.id = qaqc_single_run_results.psboard_id
    AND qaqc_single_run_results.runid = qaqc_runs.id
    AND qaqc_positions.id = qaqc_single_run_results.position
    -- AND ps_boards.id = 356
  ORDER BY
    qaqc_runs.run_datetime ASC,
    qaqc_positions.id;

CREATE VIEW qaqc_extra_run_table
AS
  SELECT
    ps_boards.id AS psboard_id,
    qaqc_runs.id AS runid,
    qaqc_runs.run_datetime AS run_timestamp,
    qaqc_runs.shifter,
    qaqc_runs.note AS run_note,
    qaqc_positions.name as position,
    qaqc_extra_run_results.insufficient_reset_with_10,
    qaqc_extra_run_results.reset_failed_though_reconfig_done,
    qaqc_extra_run_results.always_hit_flag_true,
    qaqc_extra_run_results.dac_is_0,
    qaqc_extra_run_results.efficiency_99percent,
    qaqc_extra_run_results.bcid_shift,
    qaqc_extra_run_results.bcid_fail_000,
    qaqc_extra_run_results.bcid_fail_111,
    qaqc_extra_run_results.low_efficiency,
    qaqc_extra_run_results.bcid_fail,
    qaqc_extra_run_results.power_out_of_range,
    qaqc_extra_run_results.invalid_register_value,
    qaqc_runs.shiftscript_ver,
    qaqc_runs.shifter,
    qaqc_extra_run_results.note AS result_note
  FROM
    ps_boards,
    qaqc_extra_run_results,
    qaqc_positions,
    qaqc_runs
  WHERE
    ps_boards.id = qaqc_extra_run_results.psboard_id
    AND qaqc_extra_run_results.runid = qaqc_runs.id
    AND qaqc_positions.id = qaqc_extra_run_results.position
  ORDER BY
    qaqc_runs.id ASC,
    qaqc_positions.id;

CREATE TABLE qaqc_eighth_run_results(
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    runid INTEGER NOT NULL,
    psboard_id INTEGER NOT NULL,
    position INTEGER NOT NULL,
    qspip INTEGER NOT NULL,
    note TEXT
);
