/* eslint-disable */
// 该文件由 OneAPI 自动生成，请勿手动修改！

declare namespace API {
  interface LoginRequestBody {
    username: string;
    password: string;
  }

  interface LoginResponse {
    token?: string;
  }

  // Thông tin 1 entity
  interface Entity {
    id: string;
    type: string;
    name: string;
  }

  // Trigger điều kiện trong TCR
  interface Trigger {
    entityID: string;
    gt: number;
    lt: number;
  }

  // Command thực thi trong TCR
  interface Command {
    to: string;
    params: string;
    type: string;
  }

  // Cấu hình ngày/tuần/tháng/năm của TCR
  interface ActiveDay {
    activeDateRange: string[];
    dayInWeek: string[];
    dayInMonth: string[];
    deactiveInYear: string[];
  }

  // TCR = Trigger Condition Rule
  interface TCR {
    id: string;
    enable: boolean;
    description: string;
    name: string;
    trigger: Trigger[];
    conditions: any[]; // chưa rõ cấu trúc nên tạm để any[]
    duration: number;
    commands: Command[];
    sendEvent: boolean;
    eventID: string;
    makeAlarm: string;
    alarmLevel: number;
    activeDay: ActiveDay;
    activeTime: number[]; // [start, end]
  }

  // Sự kiện
  interface Event {
    evtid: string;
    content: string;
  }

  // Node chính (mỗi thiết bị / sensor)
  interface Node {
    nid: string;
    subtype?: string; // có thể không có (ví dụ hum:0:21)
    enable: boolean;
    name: string;
    entities: Entity[];
    TCR?: TCR[]; // không phải node nào cũng có
    events?: Event[];
  }

  // Response root
  interface NodeResponse {
    nodes: Node[];
    synced: boolean;
  }

  interface EntityResponse {
    id: string;
    v: number;
    vs: string;
    t: number;
    type: string;
  }
  interface TransformedEntity {
    id: string;
    value: number;
    valueString: string;
    time: number;
    type: string;
  }

  interface ShipDetail {
    id: string;
    thing_id: string;
    owner_id: string;
    name: string;
    ship_type: number;
    home_port: number;
    ship_length: number;
    ship_power: number;
    reg_number: string;
    imo_number: string;
    mmsi_number: string;
    fishing_license_number: string;
    fishing_license_expiry_date: Date;
    province_code: string;
    ship_group_id: string;
    created_at: Date;
    updated_at: Date;
  }

  interface GPSResonse {
    lat: number;
    lon: number;
    s: number;
    h: number;
    fishing: boolean;
  }

  interface ShipTrackPoint {
    time: number;
    lon: number;
    lat: number;
    s: number;
    h: number;
  }

  // Trips
  interface FishingGear {
    name: string;
    number: string;
  }

  interface TripCost {
    type: string;
    unit: string;
    amount: string;
    total_cost: string;
    cost_per_unit: string;
  }

  interface TripCrewPerson {
    personal_id: string;
    name: string;
    phone: string;
    email: string;
    birth_date: Date; // ISO string (có thể chuyển sang Date nếu parse trước)
    note: string;
    address: string;
    created_at: Date;
    updated_at: Date;
  }

  interface TripCrews {
    role: string;
    joined_at: Date;
    left_at: Date | null;
    note: string | null;
    Person: TripCrewPerson;
  }

  interface FishingLogInfo {
    fish_species_id?: number;
    fish_name?: string;
    catch_number?: number;
    catch_unit?: string;
    fish_size?: number;
    fish_rarity?: number;
    fish_condition?: string;
    gear_usage?: string;
  }

  interface FishingLog {
    fishing_log_id: string;
    trip_id: string;
    start_at: Date; // ISO datetime
    end_at: Date; // ISO datetime
    start_lat: number;
    start_lon: number;
    haul_lat: number;
    haul_lon: number;
    status: number;
    weather_description: string;
    info?: FishingLogInfo[];
    sync: boolean;
  }
  interface NewFishingLogRequest {
    trip_id: string;
    start_at: Date; // ISO datetime
    start_lat: number;
    start_lon: number;
    weather_description: string;
  }

  interface Trip {
    id: string;
    ship_id: string;
    ship_length: number;
    vms_id: string;
    name: string;
    fishing_gears: FishingGear[];
    crews?: TripCrews[];
    departure_time: string; // ISO datetime string
    departure_port_id: number;
    arrival_time: string; // ISO datetime string
    arrival_port_id: number;
    fishing_ground_codes: number[];
    total_catch_weight: number | null;
    total_species_caught: number | null;
    trip_cost: TripCost[];
    trip_status: number;
    approved_by: string;
    notes: string | null;
    fishing_logs: FishingLog[] | null; // tuỳ dữ liệu chi tiết có thể định nghĩa thêm
    sync: boolean;
  }
  interface TripUpdateStateRequest {
    status: number;
    note?: string;
  }

  interface Alarm {
    name: string;
    t: number; // timestamp (epoch seconds)
    level: number;
    id: string;
  }

  interface AlarmResponse {
    alarms: Alarm[];
    level: number;
  }

  //Fish
  interface FishSpeciesResponse {
    id: number;
    name: string;
    scientific_name: string;
    group_name: string;
    species_code: string;
    note: string;
    default_unit: string;
    rarity_level: number;
    created_at: string;
    updated_at: string;
    is_deleted: boolean;
  }
  interface FishRarity {
    id: number;
    code: string;
    label: string;
    description: string;
    iucn_code: any;
    cites_appendix: any;
    vn_law: boolean;
  }

  // SOS

  interface SosRequest {
    message?: string;
  }

  interface SosResponse {
    active: boolean;
    message?: string;
    started_at?: number;
  }

  // Node
  interface Welcome {
    nodes?: Node[];
    synced?: boolean;
  }

  interface Node {
    nid?: string;
    subtype?: string;
    enable?: boolean;
    name?: string;
    entities?: Entity[];
    TCR?: Tcr[];
    events?: Event[];
  }

  interface Tcr {
    id?: string;
    enable?: boolean;
    description?: string;
    name?: string;
    trigger?: Trigger[];
    conditions?: any[];
    duration?: number;
    commands?: Command[];
    sendEvent?: boolean;
    eventID?: string;
    makeAlarm?: string;
    alarmLevel?: number;
    activeDay?: ActiveDay;
    activeTime?: number[];
  }

  interface ActiveDay {
    activeDateRange?: any[];
    dayInWeek?: any[];
    dayInMonth?: any[];
    deactiveInYear?: any[];
  }

  interface Command {
    to?: string;
    params?: string;
    type?: string;
  }

  interface Trigger {
    entityID?: string;
    gt?: number;
    lt?: number;
  }

  interface Entity {
    id?: string;
    type?: string;
    name?: string;
  }

  interface Event {
    evtid?: string;
    content?: string;
  }

  // Banzone
  export interface Zone {
    id?: string;
    name?: string;
    type?: number;
    conditions?: Condition[];
    enabled?: boolean;
    updated_at?: Date;
    geom?: Geom;
  }

  export interface Condition {
    max?: number;
    min?: number;
    type?: Type;
    to?: number;
    from?: number;
  }

  export enum Type {
    LengthLimit = 'length_limit',
    MonthRange = 'month_range',
  }

  export interface Geom {
    geom_type?: number;
    geom_poly?: string;
    geom_lines?: string;
    geom_point?: string;
    geom_radius?: number;
  }
}
