#!/usr/bin/env Rscript

args <- commandArgs(trailingOnly = TRUE)
source_file <- args[[1]]
out_file <- args[[2]]

file <- args[-c(1:2)]

library(vroom)

fields <- vroom(
  col_names = c("begin", "end", "width", "col_names"),
  delim = "\t",
  "1	1	1	RECTYPE
2	8	7	SERIALNO
9	9	1	SAMPLE
10	11	2	STATE
12	12	1	REGION
13	13	1	DIVISION
14	18	5	PUMA5
19	23	5	PUMA1
24	27	4	MSACMSA5
28	31	4	MSAPMSA5
32	35	4	MSACMSA1
36	39	4	MSAPMSA1
40	41	2	AREATYP5
42	43	2	AREATYP1
44	57	14	TOTPUMA5
58	71	14	LNDPUMA5
72	85	14	TOTPUMA1
86	99	14	LNDPUMA1
100	101	2	SUBSAMPL
102	105	4	HWEIGHT
106	107	2	PERSONS
108	108	1	UNITTYPE
109	109	1	HSUB
110	110	1	HAUG
111	111	1	VACSTAT
112	112	1	VACSTATA
113	113	1	TENURE
114	114	1	TENUREA
115	116	2	BLDGSZ
117	117	1	BLDGSZA
118	118	1	YRBUILT
119	119	1	YRBUILTA
120	120	1	YRMOVED
121	121	1	YRMOVEDA
122	122	1	ROOMS
123	123	1	ROOMSA
124	124	1	BEDRMS
125	125	1	BEDRMSA
126	126	1	CPLUMB
127	127	1	CPLUMBA
128	128	1	CKITCH
129	129	1	CKITCHA
130	130	1	PHONE
131	131	1	PHONEA
132	132	1	FUEL
133	133	1	FUELA
134	134	1	VEHICL
135	135	1	VEHICLA
136	136	1	BUSINES
137	137	1	BUSINESA
138	138	1	ACRES
139	139	1	ACRESA
140	140	1	AGSALES
141	141	1	AGSALESA
142	145	4	ELEC
146	146	1	ELECA
147	150	4	GAS 
151	151	1	GASA
152	155	4	WATER 
156	156	1	WATERA
157	160	4	OIL 
161	161	1	OILA
162	165	4	RENT 
166	166	1	RENTA
167	167	1	MEALS
168	168	1	MEALSA
169	169	1	MORTG1
170	170	1	MORTG1A
171	175	5	MRT1AMT
176	176	1	MRT1AMTA
177	177	1	MORTG2
178	178	1	MORTG2A
179	183	5	MRT2AMT
184	184	1	MRT2AMTA
185	185	1	TAXINCL
186	186	1	TAXINCLA
187	188	2	TAXAMT
189	189	1	TAXAMTA
190	190	1	INSINCL
191	191	1	INSINCLA
192	195	4	INSAMT
196	196	1	INSAMTA
197	200	4	CONDFEE
201	201	1	CONDFEEA
202	203	2	VALUE
204	204	1	VALUEA
205	205	1	MHLOAN
206	206	1	MHLOANA
207	211	5	MHCOST
212	212	1	MHCOSTA
213	213	1	HHT
214	215	2	P65
216	217	2	P18
218	219	2	NPF
220	221	2	NOC
222	223	2	NRC
224	224	1	PSF
225	225	1	PAOC
226	226	1	PARC
227	227	1	SVAL
228	232	5	SMOC
233	235	3	SMOCAPI
236	236	1	SRNT
237	240	4	GRENT
241	243	3	GRAPI
244	244	1	FNF
245	245	1	HHL
246	246	1	LNGI
247	247	1	WIF
248	248	1	EMPSTAT
249	250	2	WORKEXP
251	258	8	HINC
259	266	8	FINC
"
)

fields$begin <- fields$begin - 1

types <- cols(
  .default = col_double(),
  RECTYPE = col_character(),
  SERIALNO = col_character(),
  STATE = col_character(),
  PUMA5 = col_character(),
  PUMA1 = col_character(),
  MSACMSA5 = col_character(),
  MSAPMSA5 = col_character(),
  MSACMSA1 = col_character(),
  MSAPMSA1 = col_character(),
  AREATYP5 = col_character(),
  AREATYP1 = col_character(),
  LNDPUMA5 = col_character(),
  TOTPUMA1 = col_character(),
  LNDPUMA1 = col_character(),
  SUBSAMPL = col_character(),
  HWEIGHT = col_character(),
  PERSONS = col_character(),
  BLDGSZ = col_character(),
  ELEC = col_character(),
  GAS = col_character(),
  WATER = col_character(),
  OIL = col_character(),
  RENT = col_character(),
  MRT1AMT = col_character(),
  MRT2AMT = col_character(),
  TAXAMT = col_character(),
  INSAMT = col_character(),
  CONDFEE = col_character(),
  VALUE = col_character(),
  MHCOST = col_character(),
  P65 = col_character(),
  P18 = col_character(),
  NPF = col_character(),
  NOC = col_character(),
  NRC = col_character(),
  SMOC = col_character(),
  SMOCAPI = col_character(),
  GRENT = col_character(),
  GRAPI = col_character(),
  WORKEXP = col_character(),
  HINC = col_character(),
  FINC = col_character()
)

cat(source_file, "\n")
out <- bench::workout_expressions(as.list(parse(
  source_file,
  keep.source = FALSE
)))

x <- vroom::vroom(file, col_types = list())

out$size <- sum(file.size(file))
out$rows <- nrow(x)
out$cols <- ncol(x)
out$process <- as.numeric(out$process)
out$real <- as.numeric(out$real)
out$max_memory <- as.numeric(bench::bench_process_memory()[["max"]])

vroom::vroom_write(out, out_file)
