package fetch

import cats.effect.IO
import cats.effect.unsafe.implicits.global
import cats.implicits.toTraverseOps
import org.scalatest.funsuite.AnyFunSuite
import org.scalatest.matchers.should.Matchers
import org.typelevel.log4cats.slf4j.Slf4jLogger

import java.time.LocalDateTime

class FetchServiceSpec extends AnyFunSuite with Matchers {
//    def fetchInRange: IO[Unit] = {
//      val from = LocalDateTime.of(2023, 4, 28, 10, 0)
//      val to = LocalDateTime.of(2023, 4, 28, 13, 30)
//      for {
//        log <- Slf4jLogger.create[IO]
//        fetch <- FetchService.of
//        //      fetchResultEither <- fetch.fetchFromDate(LocalDate.of(2023, 4, 28)).attempt
//        fetchResultEither <- fetch.fetchInRange(from, to).attempt
//        fetchServiceError = fetchResultEither.left.toOption.map(e => s"FetchServiceError: ${e.getMessage}").toList
//        fetchResult = fetchResultEither.getOrElse(List.empty)
//        (fetchErrors, successDownloads) = fetchResult.partitionMap(identity)
//        dbService <- DBService.of
//        saveResults <- successDownloads.traverse { case (name, content) => dbService.save(name, content) }
//        (saveErrors, successSaves) = saveResults.partitionMap(identity)
//        successes = successDownloads.map(s => s"fetched: ${s._1}") ++ successSaves.map(s => s"saved: $s")
//        errors = fetchServiceError ++ fetchErrors.map(e => s"FetchError: ${e.getMessage}") ++ saveErrors.map(e => s"SaveError: ${e.getMessage}")
//        _ <- log.info(s"errors: $errors")
//        _ <- log.info(s"successes: $successes")
//      } yield (successes, errors)
//    }
//
//  def fetchSingleFile: IO[Unit] = {
//    for {
//      fetch <- FetchService.of
//      fetchResultEither <- fetch.fetchSingleFile("20230524_0030.csv").attempt
//      fetchResultEither <- fetch.fetchSingleFile("20230522_0130.csv").attempt
//      fetchServiceError = fetchResultEither.left.toOption.map(e => s"FetchServiceError: ${e.getMessage}").toList
//      fetchResult = fetchResultEither.flatMap(res => res.flatMap(aaa => {
//        println(s"fffffff: ${aaa._1}")
//        Right(aaa._1)
//      }))
//      //      _ = println(s"${fetchResult.map()}")
//    } yield ()
//  }
//
//  def main(args: Array[String]): Unit = {
//    run.unsafeRunSync()
//  }
}
