import { createSimpleSchema, ModelSchema, object, primitive } from "serializr";
import * as s from "..";
import list from "./list";

import * as requests from "./requests";
export { requests };

import * as common from "./common";
export * from "./common";

export const connectionState: ModelSchema<s.ConnectionState> = {
  factory: c => new s.ConnectionState(),
  props: {
    clientToServer: primitive(),
    serverToBroker: primitive(),
    brokerToDevice: primitive()
  }
};

export const section: ModelSchema<s.Section> = {
  factory: c =>
    new (c.parentContext.target as s.SprinklersDevice).sectionConstructor(
      c.parentContext.target,
      c.json.id
    ),
  props: {
    id: primitive(),
    name: primitive(),
    state: primitive()
  }
};

export const sectionRun: ModelSchema<s.SectionRun> = {
  factory: c => new s.SectionRun(c.parentContext.target, c.json.id),
  props: {
    id: primitive(),
    section: primitive(),
    totalDuration: common.duration,
    duration: common.duration,
    startTime: common.date,
    pauseTime: common.date,
    unpauseTime: common.date
  }
};

export const sectionRunner: ModelSchema<s.SectionRunner> = {
  factory: c =>
    new (c.parentContext.target as s.SprinklersDevice).sectionRunnerConstructor(
      c.parentContext.target
    ),
  props: {
    queue: list(object(sectionRun)),
    current: object(sectionRun),
    paused: primitive()
  }
};

export const schedule: ModelSchema<s.Schedule> = {
  factory: () => new s.Schedule(),
  props: {
    times: list(object(common.timeOfDay)),
    weekdays: list(primitive()),
    from: object(common.dateOfYear),
    to: object(common.dateOfYear)
  }
};

export const programItem: ModelSchema<s.ProgramItem> = {
  factory: () => new s.ProgramItem(),
  props: {
    section: primitive(),
    duration: common.duration
  }
};

export const program: ModelSchema<s.Program> = {
  factory: c =>
    new (c.parentContext.target as s.SprinklersDevice).programConstructor(
      c.parentContext.target,
      c.json.id
    ),
  props: {
    id: primitive(),
    name: primitive(),
    enabled: primitive(),
    schedule: object(schedule),
    sequence: list(object(programItem)),
    running: primitive()
  }
};

export const sprinklersDevice = createSimpleSchema({
  connectionState: object(connectionState),
  sections: list(object(section)),
  sectionRunner: object(sectionRunner),
  programs: list(object(program))
});