2020-02-21 14:49:39 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  ' dart:io ' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  ' package:aidedejeu_flutter/models/items.dart ' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  ' package:flutter/services.dart ' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  ' package:path/path.dart ' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  ' package:sqflite/sqflite.dart ' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-29 01:40:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  ' models/filters.dart ' ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 14:49:39 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								Database  _database ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Future < Database >  get  database  async  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  if  ( _database  ! =  null )  return  _database ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  _database  =  await  getDatabaseInstance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  _database ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Future < Database >  getDatabaseInstance ( )  async  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  var  databasesPath  =  await  getDatabasesPath ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  var  path  =  join ( databasesPath ,  " library.db " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  var  exists  =  await  databaseExists ( path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-22 02:43:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  exists  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 14:49:39 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								  if  ( ! exists )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( " Creating new copy from asset " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    try  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      await  Directory ( dirname ( path ) ) . create ( recursive:  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  catch  ( _ )  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ByteData  data  =  await  rootBundle . load ( join ( " assets " ,  " library.db " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    List < int >  bytes  = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    data . buffer . asUint8List ( data . offsetInBytes ,  data . lengthInBytes ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    await  File ( path ) . writeAsBytes ( bytes ,  flush:  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( " Opening existing database " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  await  openDatabase ( path ,  readOnly:  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Future < Item >  getItemWithId ( String  id )  async  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  print ( " getItemWithId  "  +  id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  final  db  =  await  database ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-22 00:59:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  var  response  =  await  db . query ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      " Items " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      where:  " Id = ? OR RootId = ? " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      whereArgs:  [ id ,  id ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 14:49:39 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								  if  ( response . isEmpty )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( " Id not found " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  response . isNotEmpty  ?  itemFromMap ( response . first )  :  null ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-27 20:48:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Future < Item >  loadChildrenItems ( Item  item ,  List < Filter >  filters )  async  {  
						 
					
						
							
								
									
										
										
										
											2020-02-28 17:59:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  print ( " getChildrenItems  "  +  ( item ? . itemType  ? ?  " " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  if  ( item . itemType . endsWith ( " Items " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 21:28:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    String  itemType  = 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-28 17:59:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    item . itemType . substring ( 0 ,  item . itemType . length  -  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 14:49:39 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    String  family  =  " " ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-22 00:59:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( item  is  FilteredItems )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-29 01:40:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      family  =  item . family  ? ?  " " ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 14:49:39 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-27 20:48:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    String  whereFilter  =  " " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if ( filters  ! =  null )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      filters . forEach ( ( filter )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if ( filter . selectedValues . isNotEmpty )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-27 21:06:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								          whereFilter  =  "  AND ( ${ filter . name }  LIKE '% "  +  filter . selectedValues . join ( " %' OR  ${ filter . name }  LIKE '% " )  +  " %') " ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-27 20:48:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-27 23:30:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if ( filter . rangeValues  ! =  null  & &  ( filter . rangeValues . start  >  0  | |  filter . rangeValues . end  <  filter . values . length  -  1 )  )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          whereFilter  =  "  AND ([ ${ filter . name } ] BETWEEN ' ${ filter . values [ filter . rangeValues . start . round ( ) ] } ' AND ' ${ filter . values [ filter . rangeValues . end . round ( ) ] } ') " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-27 20:48:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( whereFilter ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 14:49:39 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    final  db  =  await  database ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-22 00:59:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    var  response  =  await  db . query ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " Items " , 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-27 20:48:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        where:  " ItemType = ? AND Family = ? "  +  whereFilter , 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 21:28:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        whereArgs:  [ itemType ,  family ] , 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-22 00:59:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        orderBy:  " NormalizedName " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 14:49:39 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  ( response . isEmpty )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-22 00:59:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      print ( " Children not found " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 14:49:39 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-28 17:59:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    item . children  =  response . isNotEmpty 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-21 14:49:39 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        ?  itemsFromMapList ( response ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        :  null ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  item ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}