#include "funkey_prod_screens.h"


/// Defines

/// Static variables


/// -------------- FUNCTIONS IMPLEMENTATION --------------

/// Nearest neighboor optimized with possible out of screen coordinates (for cropping)
SDL_Surface * zoomSurface(SDL_Surface *src_surface, int dst_width, int dst_height){

  /* Declare vars */
  int x_ratio;
  int y_ratio;
  int x2, y2;
  int i, j;
  int rat;

  /* Sanity checks */
  if(src_surface == NULL){
    printf("ERROR in %s, sanity check\n", __func__);
    return NULL;
  }

  /* Compute zoom ratio */
  x_ratio = (int)((src_surface->w << 16) / dst_width);
  y_ratio = (int)((src_surface->h << 16) / dst_height);

  /* Create dst surface */
  SDL_Surface *dst_surface = SDL_CreateRGBSurface(src_surface->flags,
      dst_width, dst_height,
      src_surface->format->BitsPerPixel,
      src_surface->format->Rmask, src_surface->format->Gmask,
      src_surface->format->Bmask, src_surface->format->Amask);
  if(dst_surface == NULL){
    printf("ERROR in %s, cannot create dst_surface: %s\n", __func__, SDL_GetError());
  }

  /* Columns iterations */
  for (i = 0; i < dst_surface->h; i++)
  {

    /* Get current lines in src and dst surfaces */
    uint8_t* t = ( (uint8_t*) dst_surface->pixels + (i*dst_surface->w)*dst_surface->format->BytesPerPixel );
    y2 = ((i*y_ratio)>>16);
    uint8_t* p = ( (uint8_t*) src_surface->pixels + (y2*src_surface->w)*src_surface->format->BytesPerPixel );
    rat =  0;

    /* Lines iterations */
    for (j = 0; j < dst_surface->w; j++)
    {

      /* Get current pixel in src surface */
      x2 = (rat>>16);

      /* Copy src pixel in dst surface */
      memcpy(t, p+x2*src_surface->format->BytesPerPixel, dst_surface->format->BytesPerPixel);
      t += dst_surface->format->BytesPerPixel;

      /* Update x position in source surface */
      rat += x_ratio;
    }
  }

  /* Return new zoomed surface */
  return dst_surface;
}




int launch_prod_screen_showImage(int argc, char *argv[]){
    SDL_Event event;
    SDL_Surface *text_surface = NULL;
    SDL_Rect text_pos;
    int res = EXIT_FAILURE;
    int stop_menu_loop = 0;

    /* Fill screen white */
    SDL_FillRect(hw_surface, NULL, SDL_MapRGBA(hw_surface->format, bg_color.r, bg_color.g, bg_color.b, 0) );

    /* Write Title */
    text_surface = TTF_RenderText_Shaded(font_info, "SCAN & PRINT", text_color, bg_color);
    int height_title = text_surface->h;
    text_pos.x = hw_surface->w/2 - text_surface->w/2;
    text_pos.y = 0;
    SDL_BlitSurface(text_surface, NULL, hw_surface, &text_pos);
    SDL_FreeSurface(text_surface);

    /* Write:
        "L=FAIL"
    */
    SDL_Color red_color={220,20,20};
    text_surface = TTF_RenderText_Shaded(font_info, "L=FAIL", red_color, bg_color);
    int height_buttons = text_surface->h;
    text_pos.x = X_PADDING;
    text_pos.y = hw_surface->h  - text_surface->h;
    SDL_BlitSurface(text_surface, NULL, hw_surface, &text_pos);
    SDL_FreeSurface(text_surface);

    /* Write:
        "R=OK"
    */
    SDL_Color green_color={20,220,20};
    text_surface = TTF_RenderText_Shaded(font_info, "R=DONE", green_color, bg_color);
    text_pos.x = hw_surface->w - text_surface->w - X_PADDING;
    text_pos.y = hw_surface->h  - text_surface->h;
    SDL_BlitSurface(text_surface, NULL, hw_surface, &text_pos);
    SDL_FreeSurface(text_surface);

    /* Load Img */
    char *img_path = argv[0];
    SDL_Surface *image=IMG_Load(img_path);
    if(!image) {
        printf("ERROR IMG_Load: %s\n", IMG_GetError());
        printf("IMG path is: %s\n", img_path);
        exit(1);
    }
    SDL_SetAlpha( image, 0, SDL_ALPHA_OPAQUE );

    /* Convert to RGBA 32bits*/
    SDL_Surface *image_rgb_RGBA32b = SDL_CreateRGBSurface(SDL_SWSURFACE, image->w, image->h, 32, 
      image->format->Rmask, image->format->Gmask,
      image->format->Bmask, image->format->Amask);
    SDL_BlitSurface(image, NULL, image_rgb_RGBA32b, NULL);
    SDL_FreeSurface(image);

    /* Resize image */
    int new_img_height = hw_surface->h - height_buttons - height_title;
    int new_img_width = image->w *new_img_height / image->h;
    SDL_Surface *image_RGBA32b_resized = zoomSurface(image_rgb_RGBA32b, new_img_width, new_img_height);
    //SDL_SaveBMP(image_RGBA32b_resized,"./image_RGBA32b_resized.bmp");
    SDL_FreeSurface(image_rgb_RGBA32b);
    
    /* Blit image */
    SDL_Rect pos_img = {(hw_surface->w-image_RGBA32b_resized->w)/2, height_title, image_RGBA32b_resized->w, image_RGBA32b_resized->h};
    SDL_BlitSurface(image_RGBA32b_resized, NULL, hw_surface, &pos_img);
    SDL_FreeSurface(image_RGBA32b_resized);

    /// -------- Main loop ---------
    while (!stop_menu_loop)
    {
        /// -------- Handle Keyboard Events ---------
        while (SDL_PollEvent(&event))
        switch(event.type)
        {
            case SDL_QUIT:
                stop_menu_loop = 1;
        break;
        case SDL_KEYDOWN:
            switch (event.key.keysym.sym)
            {
                case SDLK_m:
                    stop_menu_loop = 1;
                    res = ERROR_MANUAL_FAIL;
                    break;

                case SDLK_n:
                case SDLK_ESCAPE:
                    stop_menu_loop = 1;
                    res = 0;
                    break;

                default:
                    break;
            }
        }

        /* To investigate but with Buildroot, we need this: */
        SDL_Flip(hw_surface);

        /* Sleep for some time */
        SDL_Delay(SLEEP_PERIOD_MS);
    }

    return res;
}

