/**
 * @flow
 */

/////////////////////////////////////////////////
// == Importing Class Type (Default Export) == //
/////////////////////////////////////////////////

import type ClassFoo1 from "./ExportDefault_Class";
import {foo1Inst} from "./ExportDefault_Class";

var a1: ClassFoo1 = foo1Inst;
var a2: number = foo1Inst; // Error: ClassFoo1 ~> number
new ClassFoo1(); // Error: ClassFoo1 is not a value-identifier

///////////////////////////////////////////////
// == Importing Class Type (Named Export) == //
///////////////////////////////////////////////

import type {ClassFoo2} from "./ExportNamed_Class";
import {foo2Inst} from "./ExportNamed_Class";

var b1: ClassFoo2 = foo2Inst;
var b2: number = foo2Inst; // Error: ClassFoo2 ~> number
new ClassFoo2(); // Error: ClassFoo2 is not a value-identifier

/////////////////////////////////////////////////////
// == Importing Class Type (CJS Default Export) == //
/////////////////////////////////////////////////////

import type ClassFoo3T from "./ExportCJSDefault_Class";
import ClassFoo3 from "./ExportCJSDefault_Class";
var c1: ClassFoo3T = new ClassFoo3();
new ClassFoo3T(); // Error: ClassFoo3 is not a value-identifier

///////////////////////////////////////////////////
// == Importing Class Type (CJS Named Export) == //
///////////////////////////////////////////////////

import type {ClassFoo4, ClassFoo5} from "./ExportCJSNamed_Class";
import {foo4Inst, foo5Inst} from "./ExportCJSNamed_Class";

var d1: ClassFoo4 = foo4Inst;
var d2: number = foo4Inst; // Error: ClassFoo4 ~> number
new ClassFoo4(); // Error: ClassFoo4 is not a value-identifier
// TODO: this errors correctly, but the message is just 'can't resolve name'
var d3: typeof ClassFoo5 = foo5Inst; // Error: Can't typeof a type alias

////////////////////////////////////////////
// == Import Type Alias (Named Export) == //
////////////////////////////////////////////

import type {AliasFoo3} from "./ExportNamed_Alias";
import {givesAFoo3Obj} from "./ExportNamed_Alias";
var e1: AliasFoo3 = givesAFoo3Obj();
var e2: number = givesAFoo3Obj(); // Error: AliasFoo3 ~> number
var e3: typeof AliasFoo3 = givesAFoo3Obj(); // Error: Can't typeof a type alias

//////////////////////////////////////////////
// == Import Type Alias (Default Export) == //
//////////////////////////////////////////////

// TODO: No support for this right now. It's most likely possible, but it's
//       unclear how useful it is at the moment and it entails a little
//       more work than named type exports, so I'm punting on it for now.

///////////////////////////////////////////////////////
// == Import Type With Non-Alias Compatible Value == //
///////////////////////////////////////////////////////

import type {numValue} from "./ExportsANumber"; // Error: Cannot import-type a number value

////////////////////////////////////////////////////////////////////////
// == Regression Test: https://github.com/facebook/flow/issues/359 == //
// Ensure that type bindings stay type bindings across function body  //
// env contexts.                                                      //
////////////////////////////////////////////////////////////////////////

import type ClassFoo6 from "./issue-359";
function foo() {
  ClassFoo6; // Error: Not a value binding
}

//////////////////////////////////////////////////
// == Import Type of Object (Default Export) == //
//////////////////////////////////////////////////

import type Obj from './ExportObject';

////////////////////////////////////////////////////////
// == Import Type of Exact Object (Default Export) == //
////////////////////////////////////////////////////////

import type ExactObj from './ExportExactObject';
