#ifndef MY_GEOMETRY_HH
#define MY_GEOMETRY_HH

#include <dune/common/fassign.hh>
#include <dune/common/fvector.hh>

#include <dune/fufem/arithmetic.hh>

#ifdef HAVE_CAIROMM
#include <cairomm/context.h>
#include <cairomm/fontface.h>
#include <cairomm/surface.h>
#endif

namespace MyGeometry {
namespace {
  using LocalVector = Dune::FieldVector<double, 2>;

  // kludge because fieldvectors have no initialiser_list constructor, see
  // https://dune-project.org/flyspray/index.php?do=details&task_id=1166
  LocalVector generateVector(double x, double y) {
    LocalVector tmp;
    tmp <<= x, y;
    return tmp;
  }

  double degreesToRadians(double degrees) {
    return M_PI * degrees / 180;
  };

  LocalVector convexCombination(LocalVector const &x, LocalVector const &y) {
    LocalVector ret;
    ret = 0.0;
    Arithmetic::addProduct(ret, 0.5, x);
    Arithmetic::addProduct(ret, 0.5, y);
    return ret;
  }

  double leftLeg = 1.00;
  double rightLeg = 0.27;
  double leftAngle = degreesToRadians(15);
  double rightAngle = degreesToRadians(75);

  double const depth = 0.10;
}

LocalVector const A = generateVector(0, 0);
LocalVector const B = generateVector(std::hypot(leftLeg, rightLeg), 0);
LocalVector const C = generateVector(leftLeg * std::sin(rightAngle),
                                     leftLeg * std::sin(leftAngle));

LocalVector const Y = generateVector(0.35 / std::sin(rightAngle), 0);
LocalVector const X = generateVector(Y[0] - 0.20, 0);
LocalVector const Z =
    generateVector(0.35 * std::sin(rightAngle), 0.35 * std::sin(leftAngle));

LocalVector const U = generateVector(Z[0] * X[0] / Y[0], Z[1] * X[0] / Y[0]);

LocalVector const K = generateVector(B[0] - 0.06 / std::sin(leftAngle), 0);
LocalVector const M = generateVector(B[0] - 0.06 * std::sin(leftAngle),
                                     0.06 * std::sin(rightAngle));

LocalVector const G = convexCombination(A, X);
LocalVector const H = convexCombination(X, Y);
LocalVector const J = convexCombination(Y, B);

LocalVector const I = generateVector(Y[0] + G[0], 0);

LocalVector const zenith =
    generateVector(-std::sin(leftAngle), std::cos(leftAngle));

LocalVector const rotatedZenith =
    generateVector(-std::cos(leftAngle), -std::sin(leftAngle));

double verticalProjection(LocalVector const &);
double horizontalProjection(LocalVector const &);

void write();

void render();
}
#endif