use log::trace;

use crate::bvh::BVH;
use crate::camera::Camera;
use crate::hitable::Hit;
use crate::material::Lambertian;
use crate::material::Metal;
use crate::moving_sphere::MovingSphere;
use crate::renderer::Opt;
use crate::renderer::Scene;
use crate::sphere::Sphere;
use crate::texture::ConstantTexture;
use crate::vec3::Vec3;

pub fn new(opt: &Opt) -> Scene {
    let lookfrom = Vec3::new(3., 3., 2.);
    let lookat = Vec3::new(0., 0., -1.);
    let dist_to_focus = (lookfrom - lookat).length();
    let aperture = 0.1;
    let time_min = 0.;
    let time_max = 1.;
    let camera = Camera::new(
        lookfrom,
        lookat,
        Vec3::new(0., 1., 0.),
        45.,
        opt.width as f32 / opt.height as f32,
        aperture,
        dist_to_focus,
        time_min,
        time_max,
    );
    let b = BVH::new(
        vec![
            Box::new(Sphere::new(
                Vec3::new(0., 0., -1.),
                0.5,
                Lambertian::new(ConstantTexture::new(Vec3::new(0.1, 0.2, 0.5))),
            )),
            Box::new(Sphere::new(
                Vec3::new(0., -100.5, -1.),
                100.,
                Lambertian::new(ConstantTexture::new(Vec3::new(0.8, 0.8, 0.8))),
            )),
            Box::new(Sphere::new(
                Vec3::new(1., 0., -1.),
                0.5,
                Metal::new(Vec3::new(0.6, 0.6, 0.6), 0.2),
            )),
            Box::new(MovingSphere::new(
                Vec3::new(-1., 0., -1.25),
                Vec3::new(-1., 0., -0.75),
                0.5,
                time_min,
                time_max,
                Lambertian::new(ConstantTexture::new(Vec3::new(0.2, 0.8, 0.2))),
            )),
        ],
        time_min,
        time_max,
    );
    trace!(target: "bvh", "World {}", b);
    let world: Box<dyn Hit> = Box::new(b);
    Scene {
        camera,
        world,
        subsamples: opt.subsamples,
        num_threads: opt.num_threads,
        width: opt.width,
        height: opt.height,
        ..Default::default()
    }
}
