{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE OverloadedStrings #-}

module LensSpec (spec, main) where

import Control.Lens
import Data.Proxy
import Data.Schematic
import Data.Vinyl
import Test.Hspec


type ArraySchema = 'SchemaArray '[ 'AEq 1] ('SchemaNumber '[ 'NGt 10])

type ArrayField = '("foo", ArraySchema)

type FieldsSchema =
  '[ '("bar", 'SchemaOptional ('SchemaText '[ 'TEnum '["foo", "bar"]])), ArrayField]

arrayData :: JsonRepr ArraySchema
arrayData = ReprArray [ReprNumber 13]

arrayField :: FieldRepr ArrayField
arrayField = FieldRepr arrayData

objectData :: Rec FieldRepr FieldsSchema
objectData = FieldRepr (ReprOptional (Just (ReprText "foo")))
  :& FieldRepr arrayData
  :& RNil

type BigRecord = Rec FieldRepr
  '[ '("f1", 'SchemaNumber '[])
  ,  '("f2", 'SchemaNumber '[])
  ,  '("f3", 'SchemaNumber '[])
  ,  '("f4", 'SchemaNumber '[])
  ,  '("f5", 'SchemaNumber '[])
  ,  '("f6", 'SchemaNumber '[])
  ,  '("f7", 'SchemaNumber '[])
  ,  '("f8", 'SchemaNumber '[])
  ,  '("f9", 'SchemaNumber '[])
  ,  '("f10", 'SchemaNumber '[])
  ,  '("f11", 'SchemaNumber '[])
  ,  '("f12", 'SchemaNumber '[])
  ,  '("f13", 'SchemaNumber '[])
  ,  '("f14", 'SchemaNumber '[])
  ,  '("f15", 'SchemaNumber '[])
  ,  '("f16", 'SchemaNumber '[])
  ,  '("f17", 'SchemaNumber '[])
  ,  '("f18", 'SchemaNumber '[])
  ,  '("f19", 'SchemaNumber '[])
  ,  '("f20", 'SchemaNumber '[])
  ,  '("f21", 'SchemaNumber '[])
  ,  '("f22", 'SchemaNumber '[])
  ,  '("f23", 'SchemaNumber '[])
  ,  '("f24", 'SchemaNumber '[])
  ,  '("f25", 'SchemaNumber '[])
  ,  '("f26", 'SchemaNumber '[])
  ,  '("f27", 'SchemaNumber '[])
  ,  '("f28", 'SchemaNumber '[])
  ,  '("f29", 'SchemaNumber '[])
  ,  '("f30", 'SchemaNumber '[])
  ,  '("f31", 'SchemaNumber '[])
  ,  '("f32", 'SchemaNumber '[])
  ,  '("f33", 'SchemaNumber '[])
  ,  '("f34", 'SchemaNumber '[])
  ,  '("f35", 'SchemaNumber '[])
  ,  '("f36", 'SchemaNumber '[])
  ,  '("f37", 'SchemaNumber '[])
  ,  '("f38", 'SchemaNumber '[])
  ,  '("f39", 'SchemaNumber '[])
  ,  '("f40", 'SchemaNumber '[])
  ,  '("f41", 'SchemaNumber '[])
  ,  '("f42", 'SchemaNumber '[])
  ,  '("f43", 'SchemaNumber '[])
  ,  '("f44", 'SchemaNumber '[])
  ,  '("f45", 'SchemaNumber '[])
  ,  '("f46", 'SchemaNumber '[])
  ,  '("f47", 'SchemaNumber '[])
  ,  '("f48", 'SchemaNumber '[])
  ,  '("f49", 'SchemaNumber '[])
  ,  '("f50", 'SchemaNumber '[])
  ,  '("f51", 'SchemaNumber '[])
  ,  '("f52", 'SchemaNumber '[])
  ,  '("f53", 'SchemaNumber '[])
  ,  '("f54", 'SchemaNumber '[])
  ,  '("f55", 'SchemaNumber '[])
  ,  '("f56", 'SchemaNumber '[])
  ,  '("f57", 'SchemaNumber '[])
  ,  '("f58", 'SchemaNumber '[])
  ,  '("f59", 'SchemaNumber '[])
  ,  '("f60", 'SchemaNumber '[])
  ,  '("f61", 'SchemaNumber '[])
  ,  '("f62", 'SchemaNumber '[])
  ,  '("f63", 'SchemaNumber '[])
  ,  '("f64", 'SchemaNumber '[])
  ,  '("f65", 'SchemaNumber '[])
  ,  '("f66", 'SchemaNumber '[])
  ,  '("f67", 'SchemaNumber '[])
  ,  '("f68", 'SchemaNumber '[])
  ,  '("f69", 'SchemaNumber '[])
  ,  '("f70", 'SchemaNumber '[])
  ,  '("f71", 'SchemaNumber '[])
  ,  '("f72", 'SchemaNumber '[])
  ,  '("f73", 'SchemaNumber '[])
  ,  '("f74", 'SchemaNumber '[])
  ,  '("f75", 'SchemaNumber '[])
  ,  '("f76", 'SchemaNumber '[])
  ,  '("f77", 'SchemaNumber '[])
  ,  '("f78", 'SchemaNumber '[])
  ,  '("f79", 'SchemaNumber '[])
  ,  '("f80", 'SchemaNumber '[])
  ,  '("f81", 'SchemaNumber '[])
  ,  '("f82", 'SchemaNumber '[])
  ,  '("f83", 'SchemaNumber '[])
  ,  '("f84", 'SchemaNumber '[])
  ,  '("f85", 'SchemaNumber '[])
  ,  '("f86", 'SchemaNumber '[])
  ,  '("f87", 'SchemaNumber '[])
  ,  '("f88", 'SchemaNumber '[])
  ,  '("f89", 'SchemaNumber '[])
  ,  '("f90", 'SchemaNumber '[])
  ,  '("f91", 'SchemaNumber '[])
  ,  '("f92", 'SchemaNumber '[])
  ,  '("f93", 'SchemaNumber '[])
  ,  '("f94", 'SchemaNumber '[])
  ,  '("f95", 'SchemaNumber '[])
  ,  '("f96", 'SchemaNumber '[])
  ,  '("f97", 'SchemaNumber '[])
  ,  '("f98", 'SchemaNumber '[])
  ,  '("f99", 'SchemaNumber '[])
  ,  '("f100", 'SchemaNumber '[])
  ,  '("f101", 'SchemaNumber '[])
  ,  '("f102", 'SchemaNumber '[])
  ,  '("f103", 'SchemaNumber '[])
  ,  '("f104", 'SchemaNumber '[])
  ,  '("f105", 'SchemaNumber '[])
  ,  '("f106", 'SchemaNumber '[])
  ,  '("f107", 'SchemaNumber '[])
  ,  '("f108", 'SchemaNumber '[])
  ,  '("f109", 'SchemaNumber '[])
  ,  '("f110", 'SchemaNumber '[])
  ,  '("f111", 'SchemaNumber '[])
  ,  '("f112", 'SchemaNumber '[])
  ,  '("f113", 'SchemaNumber '[])
  ,  '("f114", 'SchemaNumber '[])
  ,  '("f115", 'SchemaNumber '[])
  ,  '("f116", 'SchemaNumber '[])
  ,  '("f117", 'SchemaNumber '[])
  ,  '("f118", 'SchemaNumber '[])
  ,  '("f119", 'SchemaNumber '[])
  ,  '("f120", 'SchemaNumber '[])
  ,  '("f121", 'SchemaNumber '[])
  ,  '("f122", 'SchemaNumber '[])
  ,  '("f123", 'SchemaNumber '[])
  ,  '("f124", 'SchemaNumber '[])
  ,  '("f125", 'SchemaNumber '[])
  ,  '("f126", 'SchemaNumber '[])
  ,  '("f127", 'SchemaNumber '[])
  ,  '("f128", 'SchemaNumber '[])
  ,  '("f129", 'SchemaNumber '[])
  ,  '("f130", 'SchemaNumber '[])
   ]

_bigRecord :: BigRecord
_bigRecord =
     FieldRepr (ReprNumber 1)
  :& FieldRepr (ReprNumber 2)
  :& FieldRepr (ReprNumber 3)
  :& FieldRepr (ReprNumber 4)
  :& FieldRepr (ReprNumber 5)
  :& FieldRepr (ReprNumber 6)
  :& FieldRepr (ReprNumber 7)
  :& FieldRepr (ReprNumber 8)
  :& FieldRepr (ReprNumber 9)
  :& FieldRepr (ReprNumber 10)
  :& FieldRepr (ReprNumber 11)
  :& FieldRepr (ReprNumber 12)
  :& FieldRepr (ReprNumber 13)
  :& FieldRepr (ReprNumber 14)
  :& FieldRepr (ReprNumber 15)
  :& FieldRepr (ReprNumber 16)
  :& FieldRepr (ReprNumber 17)
  :& FieldRepr (ReprNumber 18)
  :& FieldRepr (ReprNumber 19)
  :& FieldRepr (ReprNumber 20)
  :& FieldRepr (ReprNumber 21)
  :& FieldRepr (ReprNumber 22)
  :& FieldRepr (ReprNumber 23)
  :& FieldRepr (ReprNumber 24)
  :& FieldRepr (ReprNumber 25)
  :& FieldRepr (ReprNumber 26)
  :& FieldRepr (ReprNumber 27)
  :& FieldRepr (ReprNumber 28)
  :& FieldRepr (ReprNumber 29)
  :& FieldRepr (ReprNumber 30)
  :& FieldRepr (ReprNumber 31)
  :& FieldRepr (ReprNumber 32)
  :& FieldRepr (ReprNumber 33)
  :& FieldRepr (ReprNumber 34)
  :& FieldRepr (ReprNumber 35)
  :& FieldRepr (ReprNumber 36)
  :& FieldRepr (ReprNumber 37)
  :& FieldRepr (ReprNumber 38)
  :& FieldRepr (ReprNumber 39)
  :& FieldRepr (ReprNumber 40)
  :& FieldRepr (ReprNumber 41)
  :& FieldRepr (ReprNumber 42)
  :& FieldRepr (ReprNumber 43)
  :& FieldRepr (ReprNumber 44)
  :& FieldRepr (ReprNumber 45)
  :& FieldRepr (ReprNumber 46)
  :& FieldRepr (ReprNumber 47)
  :& FieldRepr (ReprNumber 48)
  :& FieldRepr (ReprNumber 49)
  :& FieldRepr (ReprNumber 50)
  :& FieldRepr (ReprNumber 51)
  :& FieldRepr (ReprNumber 52)
  :& FieldRepr (ReprNumber 53)
  :& FieldRepr (ReprNumber 54)
  :& FieldRepr (ReprNumber 55)
  :& FieldRepr (ReprNumber 56)
  :& FieldRepr (ReprNumber 57)
  :& FieldRepr (ReprNumber 58)
  :& FieldRepr (ReprNumber 59)
  :& FieldRepr (ReprNumber 60)
  :& FieldRepr (ReprNumber 61)
  :& FieldRepr (ReprNumber 62)
  :& FieldRepr (ReprNumber 63)
  :& FieldRepr (ReprNumber 64)
  :& FieldRepr (ReprNumber 65)
  :& FieldRepr (ReprNumber 66)
  :& FieldRepr (ReprNumber 67)
  :& FieldRepr (ReprNumber 68)
  :& FieldRepr (ReprNumber 69)
  :& FieldRepr (ReprNumber 70)
  :& FieldRepr (ReprNumber 71)
  :& FieldRepr (ReprNumber 72)
  :& FieldRepr (ReprNumber 73)
  :& FieldRepr (ReprNumber 74)
  :& FieldRepr (ReprNumber 75)
  :& FieldRepr (ReprNumber 76)
  :& FieldRepr (ReprNumber 77)
  :& FieldRepr (ReprNumber 78)
  :& FieldRepr (ReprNumber 79)
  :& FieldRepr (ReprNumber 80)
  :& FieldRepr (ReprNumber 81)
  :& FieldRepr (ReprNumber 82)
  :& FieldRepr (ReprNumber 83)
  :& FieldRepr (ReprNumber 84)
  :& FieldRepr (ReprNumber 85)
  :& FieldRepr (ReprNumber 86)
  :& FieldRepr (ReprNumber 87)
  :& FieldRepr (ReprNumber 88)
  :& FieldRepr (ReprNumber 89)
  :& FieldRepr (ReprNumber 90)
  :& FieldRepr (ReprNumber 91)
  :& FieldRepr (ReprNumber 92)
  :& FieldRepr (ReprNumber 93)
  :& FieldRepr (ReprNumber 94)
  :& FieldRepr (ReprNumber 95)
  :& FieldRepr (ReprNumber 96)
  :& FieldRepr (ReprNumber 97)
  :& FieldRepr (ReprNumber 98)
  :& FieldRepr (ReprNumber 99)
  :& FieldRepr (ReprNumber 100)
  :& FieldRepr (ReprNumber 101)
  :& FieldRepr (ReprNumber 102)
  :& FieldRepr (ReprNumber 103)
  :& FieldRepr (ReprNumber 104)
  :& FieldRepr (ReprNumber 105)
  :& FieldRepr (ReprNumber 106)
  :& FieldRepr (ReprNumber 107)
  :& FieldRepr (ReprNumber 108)
  :& FieldRepr (ReprNumber 109)
  :& FieldRepr (ReprNumber 110)
  :& FieldRepr (ReprNumber 111)
  :& FieldRepr (ReprNumber 112)
  :& FieldRepr (ReprNumber 113)
  :& FieldRepr (ReprNumber 114)
  :& FieldRepr (ReprNumber 115)
  :& FieldRepr (ReprNumber 116)
  :& FieldRepr (ReprNumber 117)
  :& FieldRepr (ReprNumber 118)
  :& FieldRepr (ReprNumber 119)
  :& FieldRepr (ReprNumber 120)
  :& FieldRepr (ReprNumber 121)
  :& FieldRepr (ReprNumber 122)
  :& FieldRepr (ReprNumber 123)
  :& FieldRepr (ReprNumber 124)
  :& FieldRepr (ReprNumber 125)
  :& FieldRepr (ReprNumber 126)
  :& FieldRepr (ReprNumber 127)
  :& FieldRepr (ReprNumber 128)
  :& FieldRepr (ReprNumber 129)
  :& FieldRepr (ReprNumber 130)
  :& RNil

spec :: Spec
spec = do
  let
    newFooVal = FieldRepr $ ReprArray [ReprNumber 15]
    fooProxy  = Proxy @"foo"
  it "gets the field from an object" $ do
    fget @"foo" objectData `shouldBe` arrayField
  it "sets the object field" $ do
    fget @"foo" (fput newFooVal objectData) `shouldBe` newFooVal

  describe "(using lens library) " $ do
    it "get the field from an object" $ do
      objectData ^. flens @"foo" `shouldBe` arrayField
    it "sets the object field" $ do
      set (flens @"foo") newFooVal objectData ^. flens @"foo"
        `shouldBe` newFooVal

main :: IO ()
main = hspec spec