; (defpackage :oven (:use "CL" "PORT" "ITER" "CL-USER" #+Ignore cl-ppcre))

(in-package :oven)


(defun skip-lines-before-line (input output line)
  "читает построчно input, пропускает все строки до line
невключительно и пишет в output"
  (with-open-file 
      (o output :direction :output :if-does-not-exist :create)
    (iter
      (with flag = nil)
      (for l in-file input using 'read-line)
      (when (string= l line) 
        (setf flag t))
      (when flag
        (write-line l o)))))
    


(defun delphi-time-to-universal-time (delphi-time)
  "время дельфи - в виде с плавающей точкой или в виде строки с разделителем запятая"
  (when (stringp delphi-time)
    (setf delphi-time (read-from-string (substitute #\. #\, delphi-time))))
  (+ (encode-universal-time 07 01 00 10 04 2011)
     (round (* (- delphi-time 40643.0007761574) 86400))
     ))


#+nil (defun merge-dnevnik (oven dcfcc output &key fix-oven-time)
  "На вход - два имени файла входных и один выходной. skip-first-column - выбрасываем время, заданное в первой колонке
дневника oven. Предполагается, что файлы за одну дату"
  (let 
      ((ovens ; список распарсенных строк
        (iter
          (for line in-file oven using 'read-line)
          (for parsed = (lispworks:split-sequence " " line))
          (for parsed-time = (subseq (lispworks:split-sequence ":" (first parsed))
                                     0 3))
          (when fix-oven-time (pop parsed))
          
          (collecting
          `(,(apply 'encode-universal-time `(,@(reverse parsed-time) 1 1 2000)) ,line))
          ))
       (dcfccs 
        (iter
          (for line in-file dcfcc using 'read-line)
          (for parsed = (lispworks:split-sequence " " line))
          (when (string= (first parsed) "Начинаю")
            (next-iteration))
          ; удаляем время дельфи, т.к. оно не нужно
          (setf parsed (remove-if (constantly t) parsed :start 1 :end 2))
          (for parsed-time = (subseq (lispworks:split-sequence ":" (first parsed))
                                     0 3))
          (collecting
          `(,(apply 'encode-universal-time `(,@(reverse parsed-time) 1 1 2000)) ,line))
          )))
    (with-open-file (o output :direction :output :if-does-not-exist :create)
      (iter (for (time line) in 
                 (merge 'list ovens dcfccs #'< :key 'car))
        (declare (ignore time))
        (format o "~A~%" line)
        ))))


(defun merge-dnevnik (oven dcfcc output &key (fix-oven-time t))
  "На вход - два имени файла входных и один выходной. skip-first-column - выбрасываем время, заданное в первой колонке
дневника oven. Предполагается, что файлы за одну дату"
  (let 
      ((ovens ; список распарсенных строк
        (iter
          (for line in-file oven using 'read-line)
          (for parsed = (lispworks:split-sequence " " line))
          (when 
              (member (first parsed) '("" "время") :test 'string=) 
            (next-iteration))
          (for parsed-time = (ignore-errors 
                               (read-from-string (first parsed))))
          (unless (numberp parsed-time) (next-iteration)) 
          (when fix-oven-time (setf parsed-time (mod (- parsed-time 0.8333333333333333) 1)))
          (collecting
          `(,parsed-time ,line))
          ))
       (dcfccs 
        (iter
          (with parsed-time = 0)
          (for line in-file dcfcc using 'read-line)
          (when (string= line "") (next-iteration))
          (for parsed = (lispworks:split-sequence " " line))
          (unless (string= (first parsed) "Начинаю") ; не пытаемся извлечь время из таких строк, 
            ; берём последнее известное
            (setf parsed-time (mod (read-from-string (substitute #\. #\, (second parsed))) 1)))
          (collecting
          `(,parsed-time ,line))
          )))
    (with-open-file (o output :direction :output :if-does-not-exist :create)
      (iter (for (time line) in 
                 (merge 'list ovens dcfccs #'< :key 'car))
        (declare (ignore time))
        (format o "~A~%" line)
        ))))
       
    
