/**
 * Silex, live web creation
 * http://projects.silexlabs.org/?/silex/
 *
 * Copyright (c) 2012 Silex Labs
 * http://www.silexlabs.org/
 *
 * Silex is available under the GPL license
 * http://www.silexlabs.org/silex/silex-licensing/
 */

/**
 * @fileoverview This file contains the definitions of the Model, View and
 * Controller structures
 *
 */
import { ContextMenuController } from './controller/context-menu-controller';
import { CssEditorController } from './controller/css-editor-controller';
import { EditMenuController } from './controller/edit-menu-controller';
import { FileMenuController } from './controller/file-menu-controller';
import { HtmlEditorController } from './controller/html-editor-controller';
import { InsertMenuController } from './controller/insert-menu-controller';
import { JsEditorController } from './controller/js-editor-controller';
import { PageToolController } from './controller/page-tool-controller';
import { PropertyToolController } from './controller/property-tool-controller';
import { SettingsDialogController } from './controller/settings-dialog-controller';
import { StageController } from './controller/stage-controller';
import { TextEditorController } from './controller/text-editor-controller';
import { ToolMenuController } from './controller/tool-menu-controller';
import { ViewMenuController } from './controller/view-menu-controller';
import { Body } from './model/body';
import { Component } from './model/Component';
import { ComponentData } from './model/Data';
import { SilexElement } from './model/element';
import { File } from './model/file';
import { Head } from './model/head';
import { Page } from './model/page';
import { Property } from './model/property';
import { BreadCrumbs } from './view/bread-crumbs';
import { ContextMenu } from './view/context-menu';
import { CssEditor } from './view/dialog/css-editor';
import { Dashboard } from './view/dialog/Dashboard';
import { FileExplorer } from './view/dialog/file-explorer';
import { HtmlEditor } from './view/dialog/html-editor';
import { JsEditor } from './view/dialog/js-editor';
import { SettingsDialog } from './view/dialog/settings-dialog';
import { Menu } from './view/menu';
import { PageTool } from './view/page-tool';
import { PropertyTool } from './view/property-tool';
import { Splitter } from './view/splitter';
import { StageWrapper } from './view/StageWrapper';
import { TextFormatBar } from './view/TextFormatBar';
import { Workspace } from './view/workspace';

/**
 * warning: if you change that type, also change the default value in LinkDialog
 */
export interface LinkData {
  href?: string;
  target?: string;
  title?: string;
  rel?: string;
  type?: string;
  download?: string;
}
export enum StickyPoint {
  LEFT = 'left',
  RIGHT = 'right',
  TOP = 'top',
  BOTTOM = 'bottom',
}
// MID_V: 'midV',
// MID_H: 'midH',
export interface StickyLine {
  id: string;
  vertical: boolean;
  position: number;
  stickyPoint: StickyPoint;
  metaData: any;
}
export interface Font {
  family: string;
  href: string;
}
export interface FileInfo {
  url: string;
  path: string;
  folder: string;
  service: string;
  size: number;
  modified: string;
  name: string;
  isDir: boolean;
  mime: string;
  absPath: string;
}
export interface Hosting {
  providers: Provider[];
  skipHostingSelection: boolean;
}
export interface Provider {
  name: string;
  displayName: string;
  isLoggedIn: boolean;
  authorizeUrl: string;
  dashboardUrl: string;
  pleaseCreateAVhost: string;
  vhostsUrl: string;
  buyDomainUrl: string;
  skipVhostSelection: boolean;
  skipFolderSelection: boolean;
  afterPublishMessage: string;
}
export interface VHost {
  name: string;
  domainUrl: string;
  skipDomainSelection: boolean;
  publicationPath: FileInfo;
  url: string;
}
export interface PublicationOptions {
  file: FileInfo;
  publicationPath: FileInfo;
  provider: Provider;
}
export interface UndoItem {
  page: string;
  html: string;
  scrollX: number;
  scrollY: number;
}
export interface ClipboardItem {
  parent: HTMLElement;
  element: HTMLElement;
  style: any;
  mobileStyle: any;
  componentData: ComponentData;
  children: ClipboardItem[];
}

/**
 * @struct
 */
export interface Model {
  file: File;
  head: Head;
  body: Body;
  page: Page;
  element: SilexElement;
  component: Component;
  property: Property;
}

/**
 * @struct
 */
export interface Controller {
  fileMenuController: FileMenuController;
  editMenuController: EditMenuController;
  viewMenuController: ViewMenuController;
  insertMenuController: InsertMenuController;
  toolMenuController: ToolMenuController;
  contextMenuController: ContextMenuController;
  stageController: StageController;
  pageToolController: PageToolController;
  propertyToolController: PropertyToolController;
  settingsDialogController: SettingsDialogController;
  htmlEditorController: HtmlEditorController;
  cssEditorController: CssEditorController;
  jsEditorController: JsEditorController;
  textEditorController: TextEditorController;
}

/**
 * @struct
 */
export interface View {
  menu: Menu;
  contextMenu: ContextMenu;
  breadCrumbs: BreadCrumbs;
  pageTool: PageTool;
  propertyTool: PropertyTool;
  textFormatBar: TextFormatBar;
  htmlEditor: HtmlEditor;
  cssEditor: CssEditor;
  jsEditor: JsEditor;
  fileExplorer: FileExplorer;
  settingsDialog: SettingsDialog;
  dashboard: Dashboard;
  propSplitter: Splitter;
  workspace: Workspace;
  stageWrapper: StageWrapper;
}
