(ns harja.palvelin.ajastetut-tehtavat.paivystystarkistukset-test
  (:require [clojure.test :refer :all]
            [taoensso.timbre :as log]
            [clj-time.periodic :refer [periodic-seq]]
            [harja.palvelin.ajastetut-tehtavat.paivystystarkistukset :as paivystajatarkistukset]
            [harja.testi :refer :all]
            [harja.palvelin.komponentit.fim-test :as fim-test]
            [harja.palvelin.komponentit.tietokanta :as tietokanta]
            [harja.palvelin.integraatiot.integraatioloki :as integraatioloki]
            [clj-time.core :as t]
            [clojure.java.io :as io]
            [com.stuartsierra.component :as component]
            [harja.palvelin.komponentit.fim :as fim]
            [harja.palvelin.palvelut.urakat :as urakat])
  (:use org.httpkit.fake))

(defn jarjestelma-fixture [testit]
  (pudota-ja-luo-testitietokanta-templatesta)
  (alter-var-root
    #'jarjestelma
    (fn [_]
      (component/start
        (component/system-map
          :db (tietokanta/luo-tietokanta testitietokanta)
          :http-palvelin (testi-http-palvelin)
          :integraatioloki (component/using (integraatioloki/->Integraatioloki nil) [:db])
          :fim (component/using
                 (fim/->FIM {:url fim-test/+testi-fim+})
                 [:db :integraatioloki])))))

  (testit)
  (alter-var-root #'jarjestelma component/stop))


(use-fixtures :once jarjestelma-fixture)

(def ilmoituksien-saajat
  [{:etunimi "Erkki"
    :kayttajatunnus "A000001"
    :organisaatio "ELY"
    :poistettu false
    :puhelin ""
    :roolinimet ["ELY_Urakanvalvoja"]
    :roolit ["ELY urakanvalvoja"]
    :sahkoposti ""
    :sukunimi "Esimerkki"
    :tunniste nil}
   {:etunimi "Eero"
    :kayttajatunnus "A000002"
    :organisaatio "ELY"
    :poistettu false
    :puhelin "0400123456789"
    :roolinimet ["vastuuhenkilo"]
    :roolit ["Urakan vastuuhenkilö"]
    :sahkoposti ""
    :sukunimi "Esimerkki"
    :tunniste nil}])

(deftest urakoiden-paivystajien-haku-toimii
  (let [testitietokanta (:db jarjestelma)
        paivystykset (paivystajatarkistukset/hae-voimassa-olevien-urakoiden-paivystykset
                                 testitietokanta
                                 (t/local-date 2016 10 1))]
  Oulun alueurakka 2014 - 2019 löytyy 3 päivystystä
    (is (= 3 (count (filter
                    #(= (:urakka-nimi %) "Oulun alueurakka 2014-2019")
                    paivystykset))))
  Muhoksen urakassa on  
    (is (= 1 (count (filter
                    #(= (:urakka-nimi %) "Muhoksen päällystysurakka")
                    paivystykset))))))

(deftest hae-kaynnissa-olevat-urakat-paivystystarkistukseen-toimii
  (let [testitietokanta (:db jarjestelma)
        urakat (paivystajatarkistukset/hae-urakat-paivystystarkistukseen testitietokanta (t/local-date 2016 1 1))]
    (is (= (count urakat) 18))
    urakat))

(deftest hae-kaynnissa-olevat-urakat-paivystystarkistukseen-toimii
  (let [testitietokanta (:db jarjestelma)
        urakat (paivystajatarkistukset/hae-urakat-paivystystarkistukseen testitietokanta (t/local-date 2007 1 1))]
    (is (= (count urakat) 1))
    urakat))

(defn- hae-urakat-ilman-paivystysta [pvm]
  (let [testitietokanta (:db jarjestelma)
        urakat (paivystajatarkistukset/hae-urakat-paivystystarkistukseen testitietokanta pvm)
        paivystykset (paivystajatarkistukset/hae-voimassa-olevien-urakoiden-paivystykset
                       testitietokanta
                       pvm)
        urakat-ilman-paivystysta (paivystajatarkistukset/urakat-ilman-paivystysta
                                   paivystykset
                                   urakat
                                   pvm)]
    urakat-ilman-paivystysta))

(deftest muhoksen-urakan-paivystys-loytyy
  (let [pvm (t/local-date 2016 1 1)
        testitietokanta (:db jarjestelma)
        urakat (paivystajatarkistukset/hae-urakat-paivystystarkistukseen testitietokanta pvm)
        urakat-ilman-paivystysta (hae-urakat-ilman-paivystysta pvm)]
  Oulun     , eli ei sisälly joukkoon " urakat   "
    (is (nil? (first (filter
                       #(= (:nimi %) "Oulun alueurakka 2014-2019")
                       urakat-ilman-paivystysta))))

  Kaikki muut urakat sisältyy
    (is (= (count urakat-ilman-paivystysta) (- (count urakat) 1)))))

(deftest oulun-urakan-paivystys-loytyy
  (let [pvm (t/local-date 2015 11 2)
        testitietokanta (:db jarjestelma)
        urakat (paivystajatarkistukset/hae-urakat-paivystystarkistukseen testitietokanta pvm)
        urakat-ilman-paivystysta (hae-urakat-ilman-paivystysta pvm)]
  Oulun 2014 - 2019 urakalla    , eli ei sisälly joukkoon " urakat   "
    (is (nil? (first (filter
                       #(= (:nimi %) "Oulun alueurakka 2014-2019")
                       urakat-ilman-paivystysta))))

  Kaikki muut urakat sisältyy
    (is (= (count urakat-ilman-paivystysta) (- (count urakat) 1)))))

(deftest oulun-urakan-paivystys-loytyy-paivystyksen-alkupaivana
  (let [pvm (t/local-date 2015 11 1)
        testitietokanta (:db jarjestelma)
        urakat (paivystajatarkistukset/hae-urakat-paivystystarkistukseen testitietokanta pvm)
        urakat-ilman-paivystysta (hae-urakat-ilman-paivystysta pvm)]
  Oulun 2014 - 2019 urakalla päivitys alkaa   , eli ei sisälly joukkoon " urakat   "
    (is (nil? (first (filter
                       #(= (:nimi %) "Oulun alueurakka 2014-2019")
                       urakat-ilman-paivystysta))))

  Kaikki muut urakat sisältyy
    (is (= (count urakat-ilman-paivystysta) (- (count urakat) 1)))))

(deftest oulun-ja-muhoksen-paivystys-loytyy
  (let [pvm (t/local-date 2015 12 5)
        testitietokanta (:db jarjestelma)
        urakat (paivystajatarkistukset/hae-urakat-paivystystarkistukseen testitietokanta pvm)
        urakat-ilman-paivystysta (hae-urakat-ilman-paivystysta pvm)]
  Oulun 2014 - 2019    
    (is (nil? (first (filter
                       #(= (:nimi %) "Oulun alueurakka 2014-2019")
                       urakat-ilman-paivystysta))))

  Kaikki muut urakat ilman päivytystä
    (is (= (count urakat-ilman-paivystysta) (- (count urakat) 1)))))

(deftest kaikki-urakat-listataan-ilman-paivystysta
  (let [pvm (t/local-date 2060 1 1)
        testitietokanta (:db jarjestelma)
        urakat (paivystajatarkistukset/hae-urakat-paivystystarkistukseen testitietokanta pvm)
        urakat-ilman-paivystysta (hae-urakat-ilman-paivystysta (t/local-date 2060 1 1))]
  Ei urakoita    ,   
    (is (= (count urakat-ilman-paivystysta) (count urakat)))))

(deftest ilmoituksien-saajien-haku-toimii
  (let [vastaus-xml (slurp (io/resource "xsd/fim/esimerkit/hae-oulun-hoidon-urakan-kayttajat.xml"))]
    (with-fake-http
      [fim-test/+testi-fim+ vastaus-xml]
      (let [vastaus (paivystajatarkistukset/hae-ilmoituksen-saajat
                      (:fim jarjestelma)
                      "1242141-OULU2")]
        (is (= vastaus ilmoituksien-saajat))))))

(ns harja.palvelin.ajastetut-tehtavat.paivystystarkistukset-test
  (:require [clojure.test :refer :all]
            [taoensso.timbre :as log]
            [clj-time.periodic :refer [periodic-seq]]
            [harja.palvelin.ajastetut-tehtavat.paivystystarkistukset :as paivystajatarkistukset]
            [harja.testi :refer :all]
            [harja.palvelin.komponentit.fim-test :as fim-test]
            [harja.palvelin.komponentit.tietokanta :as tietokanta]
            [harja.palvelin.integraatiot.integraatioloki :as integraatioloki]
            [clj-time.core :as t]
            [clojure.java.io :as io]
            [com.stuartsierra.component :as component]
            [harja.palvelin.komponentit.fim :as fim]
            [harja.palvelin.palvelut.urakat :as urakat])
  (:use org.httpkit.fake))

(defn jarjestelma-fixture [testit]
  (pudota-ja-luo-testitietokanta-templatesta)
  (alter-var-root
    #'jarjestelma
    (fn [_]
      (component/start
        (component/system-map
          :db (tietokanta/luo-tietokanta testitietokanta)
          :http-palvelin (testi-http-palvelin)
          :integraatioloki (component/using (integraatioloki/->Integraatioloki nil) [:db])
          :fim (component/using
                 (fim/->FIM {:url fim-test/+testi-fim+})
                 [:db :integraatioloki])))))

  (testit)
  (alter-var-root #'jarjestelma component/stop))


(use-fixtures :once jarjestelma-fixture)

(def ilmoituksien-saajat
  [{:etunimi "Erkki"
    :kayttajatunnus "A000001"
    :organisaatio "ELY"
    :poistettu false
    :puhelin ""
    :roolinimet ["ELY_Urakanvalvoja"]
    :roolit ["ELY urakanvalvoja"]
    :sahkoposti ""
    :sukunimi "Esimerkki"
    :tunniste nil}
   {:etunimi "Eero"
    :kayttajatunnus "A000002"
    :organisaatio "ELY"
    :poistettu false
    :puhelin "0400123456789"
    :roolinimet ["vastuuhenkilo"]
    :roolit ["Urakan vastuuhenkilö"]
    :sahkoposti ""
    :sukunimi "Esimerkki"
    :tunniste nil}])

(deftest urakoiden-paivystajien-haku-toimii
  (let [testitietokanta (:db jarjestelma)
        paivystykset (paivystajatarkistukset/hae-voimassa-olevien-urakoiden-paivystykset
                                 testitietokanta
                                 (t/local-date 2016 10 1))]
  Oulun alueurakka 2014 - 2019 löytyy 3 päivystystä
    (is (= 3 (count (filter
                    #(= (:urakka-nimi %) "Oulun alueurakka 2014-2019")
                    paivystykset))))
  Muhoksen urakassa on  
    (is (= 1 (count (filter
                    #(= (:urakka-nimi %) "Muhoksen päällystysurakka")
                    paivystykset))))))

(deftest hae-kaynnissa-olevat-urakat-paivystystarkistukseen-toimii
  (let [testitietokanta (:db jarjestelma)
        urakat (paivystajatarkistukset/hae-urakat-paivystystarkistukseen testitietokanta (t/local-date 2016 1 1))]
    (is (= (count urakat) 18))
    urakat))

(deftest hae-kaynnissa-olevat-urakat-paivystystarkistukseen-toimii
  (let [testitietokanta (:db jarjestelma)
        urakat (paivystajatarkistukset/hae-urakat-paivystystarkistukseen testitietokanta (t/local-date 2007 1 1))]
    (is (= (count urakat) 1))
    urakat))

(defn- hae-urakat-ilman-paivystysta [pvm]
  (let [testitietokanta (:db jarjestelma)
        urakat (paivystajatarkistukset/hae-urakat-paivystystarkistukseen testitietokanta pvm)
        paivystykset (paivystajatarkistukset/hae-voimassa-olevien-urakoiden-paivystykset
                       testitietokanta
                       pvm)
        urakat-ilman-paivystysta (paivystajatarkistukset/urakat-ilman-paivystysta
                                   paivystykset
                                   urakat
                                   pvm)]
    urakat-ilman-paivystysta))

(deftest muhoksen-urakan-paivystys-loytyy
  (let [pvm (t/local-date 2016 1 1)
        testitietokanta (:db jarjestelma)
        urakat (paivystajatarkistukset/hae-urakat-paivystystarkistukseen testitietokanta pvm)
        urakat-ilman-paivystysta (hae-urakat-ilman-paivystysta pvm)]
  Oulun     , eli ei sisälly joukkoon " urakat   "
    (is (nil? (first (filter
                       #(= (:nimi %) "Oulun alueurakka 2014-2019")
                       urakat-ilman-paivystysta))))

  Kaikki muut urakat sisältyy
    (is (= (count urakat-ilman-paivystysta) (- (count urakat) 1)))))

(deftest oulun-urakan-paivystys-loytyy
  (let [pvm (t/local-date 2015 11 2)
        testitietokanta (:db jarjestelma)
        urakat (paivystajatarkistukset/hae-urakat-paivystystarkistukseen testitietokanta pvm)
        urakat-ilman-paivystysta (hae-urakat-ilman-paivystysta pvm)]
  Oulun 2014 - 2019 urakalla    , eli ei sisälly joukkoon " urakat   "
    (is (nil? (first (filter
                       #(= (:nimi %) "Oulun alueurakka 2014-2019")
                       urakat-ilman-paivystysta))))

  Kaikki muut urakat sisältyy
    (is (= (count urakat-ilman-paivystysta) (- (count urakat) 1)))))

(deftest oulun-urakan-paivystys-loytyy-paivystyksen-alkupaivana
  (let [pvm (t/local-date 2015 11 1)
        testitietokanta (:db jarjestelma)
        urakat (paivystajatarkistukset/hae-urakat-paivystystarkistukseen testitietokanta pvm)
        urakat-ilman-paivystysta (hae-urakat-ilman-paivystysta pvm)]
  Oulun 2014 - 2019 urakalla päivitys alkaa   , eli ei sisälly joukkoon " urakat   "
    (is (nil? (first (filter
                       #(= (:nimi %) "Oulun alueurakka 2014-2019")
                       urakat-ilman-paivystysta))))

  Kaikki muut urakat sisältyy
    (is (= (count urakat-ilman-paivystysta) (- (count urakat) 1)))))

(deftest oulun-ja-muhoksen-paivystys-loytyy
  (let [pvm (t/local-date 2015 12 5)
        testitietokanta (:db jarjestelma)
        urakat (paivystajatarkistukset/hae-urakat-paivystystarkistukseen testitietokanta pvm)
        urakat-ilman-paivystysta (hae-urakat-ilman-paivystysta pvm)]
  Oulun 2014 - 2019    
    (is (nil? (first (filter
                       #(= (:nimi %) "Oulun alueurakka 2014-2019")
                       urakat-ilman-paivystysta))))

  Kaikki muut urakat ilman päivytystä
    (is (= (count urakat-ilman-paivystysta) (- (count urakat) 1)))))

(deftest kaikki-urakat-listataan-ilman-paivystysta
  (let [pvm (t/local-date 2060 1 1)
        testitietokanta (:db jarjestelma)
        urakat (paivystajatarkistukset/hae-urakat-paivystystarkistukseen testitietokanta pvm)
        urakat-ilman-paivystysta (hae-urakat-ilman-paivystysta (t/local-date 2060 1 1))]
  Ei urakoita    ,   
    (is (= (count urakat-ilman-paivystysta) (count urakat)))))

(deftest ilmoituksien-saajien-haku-toimii
  (let [vastaus-xml (slurp (io/resource "xsd/fim/esimerkit/hae-oulun-hoidon-urakan-kayttajat.xml"))]
    (with-fake-http
      [fim-test/+testi-fim+ vastaus-xml]
      (let [vastaus (paivystajatarkistukset/hae-ilmoituksen-saajat
                      (:fim jarjestelma)
                      "1242141-OULU2")]
        (is (= vastaus ilmoituksien-saajat))))))
