import type {
  IState,
  IUser,
  IProject,
  ICycle,
  IModule,
  IUserLite,
  IProjectLite,
  IWorkspaceLite,
} from "types";

export interface IIssueCycle {
  id: string;
  cycle_detail: ICycle;
  created_at: Date;
  updated_at: Date;
  created_by: string;
  updated_by: string;
  project: string;
  workspace: string;
  issue: string;
  cycle: string;
}

export interface IIssueModule {
  created_at: Date;
  created_by: string;
  id: string;
  issue: string;
  module: string;
  module_detail: IModule;
  project: string;
  updated_at: Date;
  updated_by: string;
  workspace: string;
}

export interface IIssueCycle {
  created_at: Date;
  created_by: string;
  cycle: string;
  cycle_detail: ICycle;
  id: string;
  issue: string;
  project: string;
  updated_at: Date;
  updated_by: string;
  workspace: string;
}

export interface IIssueParent {
  description: any;
  id: string;
  name: string;
  priority: string | null;
  sequence_id: number;
  start_date: string | null;
  target_date: string | null;
}

export interface IIssueLink {
  title: string;
  url: string;
}

export interface IIssue {
  assignees: string[];
  assignee_details: IUser[];
  assignees_list: string[];
  attachment_count: number;
  attachments: any[];
  blocked_by_issue_details: any[];
  blocked_issue_details: any[];
  blocked_issues: BlockeIssue[];
  blocked_list: string[];
  blocker_issues: BlockeIssue[];
  blockers: any[];
  blockers_list: string[];
  blocks_list: string[];
  bridge_id?: string | null;
  completed_at: Date;
  created_at: Date;
  created_by: string;
  cycle: string | null;
  cycle_id: string | null;
  cycle_detail: ICycle | null;
  description: any;
  description_html: any;
  description_stripped: any;
  estimate_point: number | null;
  id: string;
  issue_cycle: IIssueCycle | null;
  issue_link: {
    created_at: Date;
    created_by: string;
    created_by_detail: IUserLite;
    id: string;
    metadata: any;
    title: string;
    url: string;
  }[];
  issue_module: IIssueModule | null;
  label_details: any[];
  links_list: IIssueLink[];
  link_count: number;
  module: string | null;
  module_id: string | null;
  name: string;
  parent: string | null;
  parent_detail: IIssueParent | null;
  priority: string | null;
  project: string;
  project_detail: IProjectLite;
  sequence_id: number;
  sort_order: number;
  sprints: string | null;
  start_date: string | null;
  state: string;
  state_detail: IState;
  sub_issues_count: number;
  target_date: string | null;
  updated_at: Date;
  updated_by: string;
  workspace: string;
  workspace_detail: IWorkspaceLite;
  labels: any[];
  labels_list: string[];
}

export interface BlockeIssue {
  id: string;
  blocked_issue_detail?: BlockeIssueDetail;
  created_at: Date;
  updated_at: Date;
  created_by: string;
  updated_by: string;
  project: string;
  workspace: string;
  block: string;
  blocked_by: string;
  blocker_issue_detail?: BlockeIssueDetail;
}

export interface BlockeIssueDetail {
  id: string;
  name: string;
  description: string;
  priority: null;
  start_date: null;
  target_date: null;
}

export interface IIssueComment {
  id: string;
  actor: string;
  actor_detail: IUserLite;
  created_at: Date;
  updated_at: Date;
  comment: string;
  comment_html: string;
  comment_json: any;
  attachments: any[];
  created_by: string;
  updated_by: string;
  project: string;
  project_detail: IProjectLite;
  workspace: string;
  workspace_detail: IWorkspaceLite;
  issue: string;
}

export type IssuePriorities = {
  id: string;
  created_at: Date;
  updated_at: Date;
  uuid: string;
  properties: Properties;
  created_by: number;
  updated_by: number;
  user: string;
};

export type Properties = {
  assignee: boolean;
  due_date: boolean;
  labels: boolean;
  key: boolean;
  priority: boolean;
  state: boolean;
  sub_issue_count: boolean;
  link: boolean;
  attachment_count: boolean;
  estimate: boolean;
};

export interface IIssueLabels {
  id: string;
  created_at: Date;
  updated_at: Date;
  name: string;
  description: string;
  color: string;
  created_by: string;
  updated_by: string;
  project: string;
  project_detail: IProjectLite;
  workspace: string;
  workspace_detail: IWorkspaceLite;
  parent: string | null;
}

export interface IIssueActivity {
  id: string;
  actor_detail: IUserLite;
  created_at: Date;
  updated_at: Date;
  verb: string;
  field: string | null;
  old_value: string | null;
  new_value: string | null;
  comment: string;
  attachments: any[];
  old_identifier: string | null;
  new_identifier: string | null;
  created_by: string;
  updated_by: string;
  project: string;
  workspace: string;
  issue: string;
  issue_comment: string | null;
  actor: string;
}

export interface IIssueLite {
  id: string;
  name: string;
  project_id: string;
  target_date: string;
  workspace__slug: string;
}

export interface IIssueFilterOptions {
  type: "active" | "backlog" | null;
  assignees: string[] | null;
  state: string[] | null;
  labels: string[] | null;
  issue__assignees__id: string[] | null;
  issue__labels__id: string[] | null;
  priority: string[] | null;
  created_by: string[] | null;
}

export type TIssueViewOptions = "list" | "kanban" | "calendar";

export type TIssueGroupByOptions = "state" | "priority" | "labels" | "created_by" | null;

export type TIssueOrderByOptions = "-created_at" | "updated_at" | "priority" | "sort_order";

export interface IIssueViewOptions {
  group_by: TIssueGroupByOptions;
  order_by: TIssueOrderByOptions;
  filters: IIssueFilterOptions;
  target_date: string;
}

export interface IIssueAttachment {
  asset: string;
  attributes: {
    name: string;
    size: number;
  };
  created_at: string;
  created_by: string;
  id: string;
  issue: string;
  project: string;
  updated_at: string;
  updated_by: string;
  workspace: string;
}
